第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)