CSRF(クロスサイト・リクエスト・フォージェリ)
CSRFの流れ
悪い人が「トラップ用のウェブサイト」を用意します
一般ユーザーが「銀行サイト(攻撃対象)」へログインします
そしてログアウトせずに「銀行サイト」を閉じます
悪い人が一般ユーザー宛てに偽物のメールを送ります(フィッシング詐欺)
一般ユーザーがメール内のリンクをクリックして「トラップ用のサイト」へアクセスします
すると「トラップ用のサイト」から「銀行サイト」へ「一般ユーザーの口座から悪い人の口座へ300万円を送信する」というリクエストが送られます
悪い人は300万円をゲットします
対策
CSRF対策は使い捨てのトークン(ランダムな文字列)を使用することです
Number used ONCEで「NONCE(ナンス)」と呼ばれています
WordPressではwp_nonce_field()やwp_verfity_nonce()という関数が用意されています
<form method="post" action="">
<?php wp_nonce_field('update_email_action', 'my_nonce'); ?> <--- ここでnonceを生成します
<input type="text" name="email" />
<input type="submit" value="更新" />
</form>
これをPHP側で次のように検証します
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!isset($_POST['my_nonce']) || !wp_verify_nonce($_POST['my_nonce'], 'update_email_action')) {
wp_die('不正なリクエストです(CSRFの可能性)');
}
// 正常だった場合の処理
$email = sanitize_email($_POST['email']);
}