CSRF(クロスサイト・リクエスト・フォージェリ)

Security

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']);
}

BACK