SQLインジェクション・XSS・CSRFの仕組みを図解で説明 〜Webアプリへの代表的な攻撃〜
「SQLインジェクション」「XSS」「CSRF」の違いを説明できますか?
どれもWebアプリケーションへの代表的な攻撃で、名前を聞いたことがある人は多いと思います。
しかし、3つとも入力や通信を悪用する攻撃なので、違いがあいまいになりがちです。
3つの攻撃の仕組みと対策について、図を使って説明していきます。

3つの攻撃の違いは「どこで実行されるか」
3つの攻撃は、悪いことが実行される場所が違います。
- SQLインジェクション: データベース で、攻撃者のSQLが実行される
- XSS: 利用者のブラウザ で、攻撃者のスクリプトが実行される
- CSRF: Webサーバ で、利用者が意図していない操作が実行される
この違いを押さえておくと、対策も整理しやすくなります。
SQLインジェクション
Webアプリケーションは、利用者が入力した値を使ってSQLを組み立て、データベースを操作します。
例えば、ログイン画面で入力されたIDとパスワードを、そのままSQLの文字列につなげていたとします。
攻撃者が、SQLとして意味を持つ記号を混ぜた値を入力すると、SQLの意味が変わってしまいます。
これが SQLインジェクション です。

① 攻撃者が、SQLの一部になる文字列を入力する
② Webサーバが、入力をそのままSQLにつなげる
③ データベースが、意味の変わったSQLを実行する
④ パスワードの確認が無効になったり、他人のデータを読まれたりする
対策: プレースホルダを使う
対策の基本は、プレースホルダ(バインド変数)を使ってSQLを組み立てる ことです。
SQLの形を先に決めておき、入力された値は「値」としてだけ当てはめます。

入力にどんな記号が含まれていても、SQLの命令として扱われることはありません。
XSS(クロスサイトスクリプティング)
掲示板の書き込みのように、利用者の入力をそのまま画面に表示するWebページがあります。
入力にスクリプトが含まれていると、そのページを開いた人のブラウザでスクリプトが実行されてしまいます。
これが XSS(クロスサイトスクリプティング) です。

① 攻撃者が、スクリプトを含む文字列を書き込む
② Webサーバが、その文字列をそのままページに入れて返す
③ 利用者のブラウザで、スクリプトが実行される
④ Cookieを盗まれたり、偽の入力欄を表示されたりする
対策: 出力する時にエスケープする
対策の基本は、画面に出力する時にエスケープ処理をする ことです。
エスケープ処理は、「<」を「<」に置き換えるように、HTMLで特別な意味を持つ文字を、ただの文字として表示される形に変えることです。
また、CookieにHttpOnly属性を付けると、スクリプトからCookieを読めなくなるので、XSSが起きた時にCookieを盗まれる被害を減らせます。
ただし、スクリプトの実行そのものは防げないので、補助的な対策です。
CSRF(クロスサイトリクエストフォージェリ)
Webサービスにログインすると、ブラウザはログイン中であることを示すCookieを保存します。
ブラウザは、そのサービスへリクエストを送る時に、このCookieを自動で付けます。
攻撃者はこの仕組みを悪用して、ログイン中の利用者に、意図していないリクエストを送らせます。
これが CSRF(クロスサイトリクエストフォージェリ) です。

① 利用者が、Webサービスにログインしたままにしている
② 利用者が、攻撃者の用意した罠のページを開く
③ 罠のページから、Webサービスへのリクエストが自動で送られる
④ Webサービスは、本人の操作だと思って処理してしまう
書き込みや設定の変更、購入などを、本人が知らないうちに実行されてしまいます。
対策: 本人の画面から送られたか確かめる
対策の基本は、正しい画面から送られたリクエストかを確かめる ことです。
画面を表示する時に、推測できないランダムな値(トークン)を埋め込んでおき、送られてきたリクエストに、その値と同じ値が含まれているかを確かめます。
罠のページはこの値を知らないので、偽のリクエストを見分けられます。
ほかに、重要な操作の前にパスワードを再入力してもらう方法や、CookieのSameSite属性で、別のサイトからのリクエストにCookieを付けないよう制限する方法(トークンを補う対策)もあります。
3つの攻撃のまとめ

WAFのように、通信の中身を見て攻撃を止める仕組みもあります。
しかし、WAFは補助の対策で、Webアプリケーション自体を安全に作ることが基本 です。
まとめ
今回はSQLインジェクション、XSS、CSRFの仕組みについて説明しました。
SQLインジェクションはデータベースで、XSSは利用者のブラウザで、CSRFはWebサーバで、悪いことが実行されます。
どの攻撃も、入力や通信を信用しすぎることが原因です。
「入力はそのまま使わない」「出力する時はエスケープする」「本人の操作か確かめる」を覚えておきましょう。
Webシステムの仕組みについては、Webシステムを図解で解説の記事で説明しています。
WAFとファイアウォールの違いについては、ファイアウォールとDMZの仕組みを図解で説明の記事で説明しています。
データベースの中身が盗まれた時に備えて、パスワードを安全に保存する仕組みについては、パスワードのハッシュ化の仕組みを図解で説明の記事で説明しています。


