🛡️

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トークンを含む

キーポイント

1

ApplicationControllerにprotect_from_forgery自動設定(Railsデフォルト)

2

csrf_meta_tagsが<head>にトークン挿入

3

form_withがhidden authenticity_tokenフィールドを自動追加

4

サーバーがPOST/PATCH/DELETEリクエストのトークンを検証

5

トークン不一致時ActionController::InvalidAuthenticityToken例外

6

Turbo/Rails UJSがAJAXリクエストにX-CSRF-Tokenヘッダーを自動追加

メリット

  • 自動適用 — 開発者が気にする必要なし
  • form_withが自動でトークン挿入
  • OWASP推奨防御技法
  • Turboと自動互換

デメリット

  • APIアプリでは無効化または調整が必要
  • CORS設定と衝突の可能性
  • セッション期限切れ時トークン不一致エラー
  • マルチタブ使用時に問題の可能性

ユースケース

全てのRails Webアプリケーション フォーム送信保護 AJAXリクエスト保護 APIとWebの認証分離