[PHP]Webシステム攻撃手口&対策まとめ CSRF、XSS、SQLインジェクション、セッション固定化

Webシステムを開発する上で重要な知識の一つが、Webセキュリティです。
Webの勉強を始めたばかりの初心者だと、セキュリティについての勉強は後回しになりがちです。
しかし、Webシステムへの攻撃は、映画に出てくるような天才ハッカーの世界だと思ったら大間違いです。
脆弱性のあるWebシステムだと、ごく簡単なプログラムを書くだけで、データベースの情報を盗んだり、攻撃の踏み台にしたりすることができてしまいます。
そのため、全ての開発者に、脆弱性のあるシステムを作らないための知識が求められているのです。
ここでは、開発者が最低限知っておくべきWebシステムを攻撃する代表的な手口と対策について解説します。

[目次]

クロスサイトリクエストフォージェリ(CSRF)

クロスサイトリクエストフォージェリ(CSRF)とは、攻撃者が悪意のあるWebサイトを用意し、そこにアクセスした被害者のブラウザから脆弱性のあるWebサイトに悪意のある送信をさせる攻撃手法です。
攻撃者が用意したサイトから脆弱性のあるサイトの遷移画面に飛ぶように、偽のリクエストを仕込むことで行います。
CSRFへの対策は、ワンタイムトークンです。
ワンタイムトークンとは、処理のために一時的に生成するランダムな文字列のことです。

PHPの場合は、generateToken関数を使用してワンタイムトークンを生成します。
セッションデータ内のトークンと、フォームから送信されたトークンとが一致しない場合は、処理を行わないようにします。
このようにすることで、不正な経路での遷移を防ぐことができます。
PHPフレームワークのLaravelを利用している場合は、フォームタグ内に@CSRFディレクティブを入れるだけで、CSRF対策を施すことができます。
たった一文いれるだけで対策できるのは、便利ですよね。
また、Laravelは、CSRF対策をしていないと、419エラーを出して、警告してくれます。

クロスサイトスクリプティング(XSS)

クロスサイトスクリプティング(XSS)とは、攻撃者が悪意のあるスクリプトを脆弱性のあるWebサイトに送信し、脆弱性のあるサイトにアクセスした被害者のブラウザ上で悪意のあるスクリプトを実行させる攻撃手法です。
脆弱性のあるWebサイトに、悪意のあるスクリプトを出力させることで行います。
最近は、DOM-Based XSSと呼ばれるJavaScriptの脆弱性をついた手法も出てきています。
XSSへの対策は、エスケープ処理です。
エスケープ処理とは、タグやスクリプトなどの意味を持つ文字列を無効化する処理です。

PHPの場合は、htmlspecialchars関数を使用してエスケープ処理を行います。
画面上に出力する変数は、必ずエスケープ処理を通すようにしましょう。
ただし、htmlspecialchars関数で大半の攻撃パターンを防ぐことができるものの、弾けないパターンも存在しています。
以下のサイトで、様々なXSS攻撃のパターンがまとめられているので、参考にするといいでしょう。

OWASP 「Cross Site Scripting (XSS)」
https://owasp.org/www-community/attacks/xss/

HTML5 Security Cheatsheet
https://html5sec.org/

SQLインジェクション

SQLインジェクションとは、攻撃者がSQLにおいて意味のある文字列をフォームに入力して脆弱性のあるWebサイトに送信し、プログラマーが意図していないSQLをサーバー上で実行させる攻撃手法です。
この攻撃により、データベース上の情報を盗まれたり、改竄されたり、削除されたりするリスクがあります。
SQLインジェクションへの対策は、プリペアードステートメントです。
プリペアードステートメントとは、SQLをプリコンパイルし、入力データを入れる前に構文解析を済ませる機能です。
構文解析を済ませた後に入力データを入れるので、入力データによってSQL構文を書き換えられるのを防ぐことができます。
外部からの入力データを使用してSQLを組み立てる処理を書く場合は、直接SQLを組み立てずに、必ずプリペアードステートメントを利用しましょう。

セッション固定化

セッション固定化とは、攻撃者が用意したセッションIDでユーザにログインさせることで、そのユーザになりすます攻撃手法です。
被害者と同じセッションIDを使用することで、ログイン画面を経由せず、被害者のログイン後画面に直接入ることができます。
つまり、被害者のID・パスワードを知ることなく、なりすますことができるのです。
セッション固定化への対策は、セッションIDの切り替えです。
ログイン認証に成功した時にセッションIDを切り替える処理を入れることで、攻撃者が古いセッションIDを使用してなりすますのを防ぐことができます。

セキュリティに関する参考資料

セキュリティリスクのトレンドを知るには、OWASP(Open Web Application Security Project:オワスプ)が発行している「OWASP TOP 10」という資料が参考になります。
OWASPとは、システムセキュリティの向上を目的としたオープン・コミュニティのNPO団体です。
「OWASP TOP 10」は、Webセキュリティのリスクのトレンドと対策についてまとめた資料です。

OWASP TOP 10(日本語版)URL
https://owasp.org/Top10/ja/

システム運用面については、経済産業省が公開している「サイバーセキュリティ経営ガイドライン」が参考になります。

サイバーセキュリティ経営ガイドラインURL
https://www.meti.go.jp/policy/netsecurity/mng_guide.html

また、Webセキュリティのスキルを上げるのに、セキュリティコンテストCTF(Capture The Flag)というものがあります。
Webサイトのセキュリティホールを見つけるオンラインの競技で、予選だけなら誰でも気軽に参加できます。

CFT開催スケジュールサイト
https://ctftime.org/

まとめ

Webサイトを攻撃する代表的な手口と対策法について、解説しました。
クロスサイト○○という名前の攻撃は、サイトを跨いで攻撃する手口です。
○○インジェクションという名前の攻撃は、入力フォームなどを利用して意図的な文字列を送信することで、システムに悪意のある処理を挿入する手口です。
代表的な攻撃手法は、確実に頭に入れておかなければいけません。
また、攻撃手法やパターンは新しいものがドンドン出てくるため、「OWASP TOP 10」などを利用して、定期的に情報収集するように心がけましょう。