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>
しかし、このままでうまくいく場合があるのですが、
ブラウザで開くと以下のようなエラーメッセージが出るようになりました。
このエラーメッセージを調べると@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行目あたりのコードをコメントアウトすること。
リンク