CSRF
CSRF定義(WiKi)
クロスサイトリクエストフォージェリ (cross-site request forgeries) は、Webアプリケーションの脆弱性の一つもしくはそれを利用した攻撃。略称はCSRF(シーサーフ (sea-surf) と読まれる事もある)、またはXSRF。リクエスト強要、セッションライディング (session riding) とも呼ばれる。
CSRF脆弱性とは以下のような攻撃(CSRF攻撃)を可能にする脆弱性を指す:
・攻撃者はブラウザなどのユーザ・クライアントを騙し、意図しないリクエスト(たとえばHTTPリクエスト)をWebサーバに送信させる。
・Webアプリケーションがユーザ・クライアントからのリクエストを十分検証しないで受け取るよう設計されている場合、このリクエストを正規のものとして扱ってしまい、被害が発生する。
・CSRF攻撃はURL、画像の読み込み、XMLHttpRequestなどを利用して実行される。
対策
formのhidden値は暗号学的関数を通しておくという方法を紹介します。
キーワード
・openssl_random_pseudo_bytes
疑似乱数のバイト文字列を生成する
・bin2hex
バイナリのデータを16進表現に変換する
Web送信受信対策
送信側.php
//安全安心なトークンを作成(32桁数)
$TOKEN_LENGTH = 16;
$tokenByte = openssl_random_pseudo_bytes($TOKEN_LENGTH);
$csrfToken = bin2hex($tokenByte);
//セッションに設定
$_SESSION['csrfToken'] = $csrfToken;
送信側.html
//formのhidden値に設定
<input type='hidden' name='csrf' value='{$csrfToken}'>
受信側.php
if ($_POST['csrfToken'] === $_SESSION['csrfToken']) {
//正常処理
} else {
//CSRF攻撃が発生
}
参考:
・CSRF定義(WiKi)
・攻撃の手法・特徴
・リクエスト強要(CSRF)対策
---I Love PHP (。・ω・。)ノ♡