イントロダクション
CSRF(Cross-Site Request Forgery)は、ログイン済みユーザーになりすまして意図しないリクエストを送らせる攻撃です。 例えば、あなたのアプリにPOST /user/email があり、メールアドレス変更を受け付けているとします。攻撃者が別サイトでこのURLに自動送信するフォームを仕込むと、ユーザーが気づかないうちにメールアドレスが変更される可能性があります。
Laravel 13では、web ミドルウェアグループに含まれる仕組みにより、CSRF保護がデフォルトで有効です。
CSRF攻撃の防止
LaravelのPreventRequestForgery ミドルウェアは、次の2層でCSRFを防ぎます。
- Origin検証(
Sec-Fetch-Siteヘッダー) - トークン検証(セッション単位のCSRFトークン)
Origin検証
Laravelは最初にSec-Fetch-Site を確認し、同一Originからのリクエストかどうかを判定します。これはHTTPS環境で特に有効です。
Origin検証が通れば、その時点でリクエストは許可されます。通らない場合は、従来どおりCSRFトークン検証が実行されます。
Origin-onlyモード
トークン検証へのフォールバックを無効化し、Origin検証のみで判定することもできます。419 ではなく 403 を返します。
サブドメイン間リクエストなどでsame-siteを許可したい場合は、allowSameSite を設定します。
トークン検証
LaravelはセッションごとにCSRFトークンを生成します。csrf_token() またはセッションから取得できます。
web ルートで POST・PUT・PATCH・DELETE のフォームを作る場合は、必ず @csrf を含めます。
URIの除外
StripeのWebhookのように外部サービスから送られるリクエストでは、特定URIをCSRF保護から除外することがあります。可能であればWebhookルートは
web ミドルウェアグループの外に配置し、除外設定は最小限にしてください。X-CSRF-TOKEN ヘッダー
Laravelはフォームの_token だけでなく、X-CSRF-TOKEN ヘッダーも検証します。
まずトークンをmetaタグに出力します。
X-XSRF-TOKEN ヘッダー
Laravelは暗号化されたXSRF-TOKEN Cookieも送信します。AxiosやAngularは、同一Originリクエスト時にこの値を X-XSRF-TOKEN ヘッダーへ自動設定できます。
そのため、SPAやAJAXの実装ではヘッダー設定を手動で書かなくてもCSRF対策が有効になるケースがあります。