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

クロスサイトリクエストフォージェリとは

クロスサイトリクエストフォージェリは、ログインしていることを前提とする攻撃で、正規のログインユーザと同等の権限を持って、正規ユーザの意図しない操作が行われます。

クロスサイトリクエストフォージェリで攻撃の入口となる場所

例えば正規ユーザがログイン中に掲示板などに張られているリンクをクリックすると、そこが攻撃の入口となります。攻撃者のこういったリンク設置は事前に何らかの方法で行われます。

クロスサイトリクエストフォージェリの対処法

ワンタイムトークンを使います。これはプログラム処理の最初に作ったセッション変数とフォームから渡された変数トークン(token)が一致するかどうかを確認して行います。この場合、一致すれば正規ユーザと判定され、不一致になればクロスサイトリクエストフォージェリによる攻撃を受けたことになります。また、重要な操作時には、パスワード認証させるなどすると、より確実な対策となります。

クロスサイトリクエストフォージェリの対策:ワンタイムトークンとは

ワンタイムとは一回だけという意味であり、トークンは予測困難な文字列のことを言います。ワンタイムトークンは一回しか利用できない変数をハッシュ関数やmicrotime()関数などで作ります。

作り方はまず、予測困難な文字列を関数で作成し、HTML側でinputタグのvalue属性に入れるトークン変数と、同時にトークンを入れたセッション変数を作ります。value属性のトークンはsubmit(送信)することで、当該inputタグのname属性につけられた名前($_POST["名前"]といった形式)で取り出すことができます。簡単に言えば、この二つの変数を比較するコードを記述することで実現できます。また、トークンを入れたセッション変数のほうは比較後にクリアにします。そうすることでこれらの変数は、ページを読み込むたびに値が変わります。そのため、一回しか使えません。

この状態で、submitによって再度ページを読み込んでみます。するとvalue属性に入れられたtokenとtokenを入れたセッションが比較されます。この時、攻撃者の作成したページからsubmitされるとvalue属性にあるはずのトークンがないため、セッションに入れられたトークンとは一致しないことになります。これによってクロスサイトリクエストフォージェリ対策となります。

ワンタイムトークンを使うと、最初に読み込んだページとsubmitする際に読み込まれているページが同一でないと、発行されたvalue属性に入れられたtokenとtokenを入れたセッションは一致しません。一致しなかった時点でクロスサイトリクエストフォージェリ攻撃は弾かれます。