第11章 高度なプログラミング / 第3回 模擬試験

PHPのクロスサイトリクエストフォージェリ(CSRF)対策に関する次の記述のうち、正しいものはどれか。

フォーム送信時にワンタイムトークン(CSRFトークン)を検証することで対策できる。 正解
CSRF対策には`htmlspecialchars()`を使うのが最も有効である。
CSRFはサーバー側では一切対策できない攻撃である。
CSRF対策として、パスワードを平文でデータベースに保存するとよい。
解説
CSRF(クロスサイトリクエストフォージェリ)対策の代表的な手法は、フォームに埋め込んだ「ワンタイムトークン(CSRFトークン)」をサーバー側で検証することです。ログイン中のユーザーだけが知り得るトークンをリクエストに含めさせ、一致しないリクエストを拒否することで、第三者サイトからの不正なリクエストを防ぎます。 他の選択肢が誤りである理由は次の通りです。 ・`htmlspecialchars()`はHTML特殊文字をエスケープしてXSS(クロスサイトスクリプティング)を防ぐための関数であり、CSRF対策には直接関係しません。 ・CSRFはサーバー側でトークン検証や`SameSite`Cookie属性の設定などによって対策可能な攻撃です。「一切対策できない」は誤りです。 ・パスワードを平文でデータベースに保存することは、CSRF対策とは無関係どころか、情報漏洩時のリスクを著しく高める非常に危険な実装です(パスワードは`password_hash()`等でハッシュ化して保存すべきです)。 例: ``` // Laravelでは@csrfディレクティブとVerifyCsrfTokenミドルウェアで標準対応 <form method="POST" action="/submit"> @csrf ... </form> ``` (参照: 独習PHP 第4版 第11章 高度なプログラミング 11.2.3節 クロスサイトリクエストフォージェリ p.605〜607)