LaravelでCSRFから守る

CSRF

CSRFは、クロス・サイト・リクエスト・フォージェリの略称です。CSRFは、ログイン中のユーザになりすまして、悪意のある要求をされてしまうことです。


具体例として、あるユーザがWebサイトにログインして、悪意のある(罠)のリンクをクリックすると、そのリンク内の悪意のある要求(非公開の個人情報をばらまくなど)が、あたかもそのユーザの要求であるかのようにWebサイトに送信されてしまう攻撃方法です。

Laravelでは、CSRFからアプリケーションを簡単に守ることができます。

方法

formタグでPOSTリクエストを送るとき@csrfと書くだけです。

Laravel Framework は、6.20.27です。
以下は例です。

<form action="/posts/{{ $post->id}}" id="form_{{ $post->id }}" method="post" style="display:inline">
    @csrf
    <button type="submit" onclick="deletePost">delete</button>
</form>

しかし、このままでうまくいく場合があるのですが、
ブラウザで開くと以下のようなエラーメッセージが出るようになりました。

419 page expired

このエラーメッセージを調べると@csrfを入れれば解決するという記事がほとんどでしたが、@csrfを入れても直りません。

419|Page Expiredの解決方法

laravelのapp/Http/Kernel.phpの36行目あたりのコードをコメントアウトするとエラーメッセージが出なくなりました。

        protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            //\App\Http\Middleware\VerifyCsrfToken::class,    //コメントアウト
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

原因は、分かりませんが、とりあえず、めでたし、めでたし。

まとめ

fromタグでPOSTリクエストを送る際はCSRFに注意すること。

LaravelでCSRFから守るには@csrfを挿入すること。

419|Page Expiredのエラーメッセージが出た場合、app/Http/Kernel.phpの36行目あたりのコードをコメントアウトすること。