どうもこんにちは。いっとくです。
今年に入ってからPHPフレームワークの花形といっても過言ではないであろうLaravelをいじり始めております。
今まで使っていたフレームワーク(Fuel PHP)と比べると、かなり機能豊富で便利な半面、色々と覚えなきゃいけないルールが多かったり、同じような機能でもいろんなパターンの実装方法があって、おじさん困っちゃう。。。
ってなわけで初心に戻って基礎からみっちり勉強しているのですが、軽い気持ちでフォームからPOST送信したところ、こんなエラーが。
おいおいおい、エラー画面までおしゃれじゃないか。これならいくらでもエラー出しちゃうよ??
ってかステータスコード419って何?
あんまり見かけない数字なんですけど。
419:Page Expiredの原因と対処方法
って思って調べたところ、CSRF対策用のトークンがなかったり、照合できないと出るエラーらしい。
確かにフォーム内でトークン生成するの忘れていたので、CSRF対策のトークンを生成するためのディレクティブをフォームタグの中に書いて対応終了。
<form action="hoge" method="post">
@csrf
<input type="text" name="fuga">
<input type="submit" value="送信">
</form>
ここまで面倒見てくれるなんて、なんて親切なフレームワークなんだ…。
トークンの照合自体は、webのグループミドルウェアで読み込まれているapp/Http/Middleware/VerifyCsrfToken.php
で行われています。
なのでweb.phpにルートを定義していれば、フォーム内にトークンを生成するだけでCSRF対策できてしまいます。
ちなみにフォーム使っていてもGET送信の時はトークン生成しなくて大丈夫です。(GETは基本的にDBのを操作するような副作用のあるルートを定義しないので)
あとたまにページ開いてから時間立ちすぎると、セッションの期限が切れて同じエラー出るらしいです。
ということで、419エラーが出た時は、トークンがちゃんと生成されているかを見直してみましょうというお話でした。
以上、いっとくでした!
コメント