[Laravel] 特定サイト (URI)からのアクセスのみCSRF チェックを除外したい



Laravel の CSRF 対策機能

Laravel には CSRF(クロス・サイト・リクエスト・フォージェリ)対策の機能が備わっています。

詳しくは CSRF保護 6.x Laravel を見てください。

特定サイトからのアクセスを除外したい

しかし、システム連携などの都合で、特定サイト(URL)からのアクセスについては CSRF のチェックをしないようにしたい場合があります。

上記の CSRF保護 6.x Laravel (URIの除外) の例を見ると VerifyCsrfToken ミドルウェアに

と書く例が載っているので、ここにリファラーとして除外したいサイトを記載すれば良さそうに思えます。ところがうまくいきません。

なぜなら $except で指定する除外するURI とは、POST先の URL の(参照される側の)であり、参照元の URL ではないからです。

リファラーを参照して $except を変更する

では、リファラーの URL を使う方法はないのかというと、VerifyCsrfToken ミドルウェアで handle をオーバーライドすれば可能です。

これで https://example.net/ から始まる URI がリファラーにセットされているときは、/posts と /comments については CSRF チェックの除外対象とするようになります。

http → https ではリファラーが取れないので注意

通常、 Web ブラウザは、http の URL から https の URL に遷移するときはにリファラーを送出しません。

これは Laravel に限った話ではありません。リファラーを使った処理をするときには注意が必要です。特に開発やテストで http のローカル環境から https のサイトに POST してもリファラーが取れませんので気をつけてください。

参考


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です