技術メモ

神奈川在住のITエンジニアの備忘録。おもにプログラミングやネットワーク技術について、学んだことを自分の中で整理するためにゆるゆると書いています。ちゃんと検証できていない部分もあるのでご参考程度となりますが、誰かのお役に立てれば幸いです。

CSRFについて

セキュリティ脆弱性の一つであるCSRF (クロス・サイト・リクエスト・フォージェリ) について簡単に纏めてみた。

CSRFを一言で言うと、攻撃者により、webサイトの利用者が意図しないリクエストがwebサイトに対して実行されてしまうセキュリティ脆弱性のこと。

 

攻撃のメカニズム

  1. ユーザはwebサイトA(正規のサイト)にログインしている状態。(前提条件)
  2. ユーザは攻撃者が用意したwebサイトB(悪意のあるサイト)にアクセスする。
  3. webサイトBからダウンロードされたJavaScriptがユーザのwebブラウザ上で動作し、そのJavaScriptがwebサイトAに対して、ユーザの意図しないリクエストを行う。これにより、例えば、webサイトAが掲示板の場合、ユーザが意図しない書き込み等が行われてしまう。

この攻撃は、ユーザはwebサイトAにログインしている状態であり、webサイトA側からすると正規のユーザからのリクエストに見えてしまうので、webサイトAでの権限チェックなどでは防げない。

なお、webサイトB由来のJavaScriptがwebサイトAに対してリクエストを出すのは「同一生成元ポリシー」に反するので、webブラウザ側でブロックできるのは?と思った。しかし、調べたところ、上記の 3. の攻撃で使用されるであろう form タグの action 属性には同一生成元ポリシーが適用されず、任意のURLを指定できるようなので、ブロックできないらしい。

 

対策

webサイト利用者側

攻撃の前提条件はwebサイトにログインしていることなので、利用が終わったwebサイトからはこまめにログインする。

webサイト側

フォームが入ったページをクライアント側に返す時はページにCSRFトークンを含めて、クライアントからフォームデータが来たら、それに含まれているトークンをチェックする。