CSRF@PHP技術

CSRF攻撃についてです。
CSRF攻撃とは、サイトにJSを仕込んでリダイレクトさせることでユーザーの意図にかかわらず操作(掲示板に書き込みなど)させる攻撃です。
初めて知った攻撃手法です。

まず、先の掲示板を使います。
攻撃対象は掲示板の削除機能です。
削除機能はidとpassを指定し実行すると、指定したidのレスが削除される仕組みです。
では、実際のコードを見てみます

まず、HTMLに以下のコードを書きます。
idが14番目のレスを削除するようにできています。

<body onload="document.csrf1.submit();">
<form action="http://localhost/2-1.php" method="post" name="csrf1">
<input type="hidden" name="id" value="14" />
<input type="hidden" name="pass" value="aaaa" />
<input type="hidden" name="delete" value="1" />
</form>

現在の掲示板は対象の14番目のレスがあります。



ここから、上記のHTMLにアクセスすると・・・

勝手に削除されてしまいました。

このように、JavaScriptを仕込むことで勝手にフォーム内容を送信してしまうことがCSRF攻撃のコワイところです。
これを利用すれば別ユーザーになりすました上でおかしな投稿ができたり、折角投稿したレスが勝手に削除されたりされます。

これに対応するには、最も簡単な方法でリファラーチェックがあります。
具体的なコードは以下のようになります。

$myuri = 'http://localhost/2-2.php' ;
if ( strncmp( @$_SERVER['HTTP_REFERER'] , $myuri , strlen($myuri) ) ) {
	unset( $_POST ) ;
}

リファラーを調べて、リンク元のアドレスが不正である場合はPOST内容をはじく処理をしています。