CSRF保護
Cross-Site Request Forgery攻撃の自動防御
CSRF(Cross-Site Request Forgery)は悪意あるサイトがユーザーのブラウザを利用して別サイトに偽造リクエストを送る攻撃です。
Railsの自動防御:
1. <%= csrf_meta_tags %> — HTML <head>にCSRFトークン挿入
2. form_with — フォームに自動でauthenticity_token hiddenフィールド追加
3. protect_from_forgery with: :exception — トークン不一致時例外発生
動作原理:
サーバーがセッションにCSRFトークンを保存
全フォーム/AJAXリクエストにこのトークンを含む
サーバーがリクエストのトークンとセッショントークンを比較
不一致 → 422 Unprocessable Entity
注意事項:
APIアプリは
protect_from_forgery with: :null_sessionを使用AJAXリクエストは
X-CSRF-Tokenヘッダーで送信Turboは自動的にCSRFトークンを含む
キーポイント
ApplicationControllerにprotect_from_forgery自動設定(Railsデフォルト)
csrf_meta_tagsが<head>にトークン挿入
form_withがhidden authenticity_tokenフィールドを自動追加
サーバーがPOST/PATCH/DELETEリクエストのトークンを検証
トークン不一致時ActionController::InvalidAuthenticityToken例外
Turbo/Rails UJSがAJAXリクエストにX-CSRF-Tokenヘッダーを自動追加
メリット
- ✓ 自動適用 — 開発者が気にする必要なし
- ✓ form_withが自動でトークン挿入
- ✓ OWASP推奨防御技法
- ✓ Turboと自動互換
デメリット
- ✗ APIアプリでは無効化または調整が必要
- ✗ CORS設定と衝突の可能性
- ✗ セッション期限切れ時トークン不一致エラー
- ✗ マルチタブ使用時に問題の可能性