2690

PHPのCSRF対策

PHPのCSRF対策

2013.11.2

CSRF対策という言葉自体は知っていたのですが、今まで上手く分かっていませんでした。自分なりにメモしておこうと思います。

CSRF対策とは?

おおざっぱに言うと、悪意あるサイトのスクリプトやリダイレクト処理によって、意図しない別サイトへ悪意ある操作をされる事を防ぐための対策です。

例えば、Aという悪意あるサイトへアクセスしたことにより、自分が善意あるBサイトに無駄な投稿したかのような形になってしまうとか、そういった感じです。

どういう対策をすればいいのか?

厳密性を考えるといろいろな方法があると思いますが、以下のような方法があったりします。

  1. 推測されにくく、かつ毎回変わる文字列をセッション値と隠しフォーム値(hidden)の両方に持たせる
  2. postされた時にその値を比較する。
  3. 同じ値だった場合は自サイトからの投稿、違う値だった場合は外部からの投稿と判断して処理する

コード例

//フォームからPOSTされたかどうか判定
if($_SERVER['REQUEST_METHOD'] === 'POST'){
//CSRF対策(セッション値と隠しフォーム値を比較)
if($_POST['token'] !== $_SESSION['token']){
//値が違っていた場合は、不正な投稿と見なして処理を施す
echo "不正な投稿です";
exit;
}
}
?>
<!doctype html>

Document