こちらの記事では今回発生したエラー'419|PAGE EXPIRED'の解決方法と原因についてご紹介します。
今回発生した該当コードは下記の通りです。
検索ワードを入力し、画面遷移したブラウザで検索結果を表示させようとした際にエラーが発生しました。
<form method="post" action="/list/search">
<input type="text" name="search">
<button>
検索
</button>
</form>
419|PAGE EXPIRED 発生原因と解決方法
発生原因はformタグに@csrfを記述しなかったからです。
@csrfは、CSRF対策のために用意されたBladeディレクティブで、Laravelでは、CSRF対策がなされていないフォームの送信は例外が発生して受け付けられないようになっています!
ですので、formタグに@csrf
を追加すれば今回のエラーは解決します。
<form method="post" action="/list/search">
@csrf // CSRF対策
<input type="text" name="search">
<button>
検索
</button>
</form>
CSRF(Cross Site Request Forgery)とは
CSRFとはクロスサイトリクエストフォージェリ
と呼ばれるWebアプリケーションの脆弱性を利用したサイバー攻撃
の一種になります。
攻撃手法
1.攻撃者が攻撃用Webページや不正なスクリプトなどを準備し、脆弱性のあるサイトのフォームなどから不正送信。
2.攻撃対象サーバ上のWebアプリが不正なリクエストを処理し、ユーザーが意図していない処理が行われる。
影響・被害
攻撃者自身が直接攻撃対象サーバへアクセスせずに、攻撃対象のWebアプリケーションに任意の処理を行わせることができます。
主な攻撃
・いたずら的書き込み
・不正サイトへの誘導
・犯罪予告といった掲示板やアンケートフォームへの不正な書き込み
・フォームへの大量なコンテンツの送り付けによるDoS攻撃
攻撃Webページに誘導された一般ユーザに直接的な被害はありませんが、攻撃対象サーバへの不正なリクエストを送信した攻撃者として認識されてしまうことがあります。
DoS攻撃
情報セキュリティにおける可用性(利用者が必要なときに安全にアクセスできる状態)
を侵害する攻撃手法の一種。
Webサービスを稼働しているサーバやネットワークなどのリソース(資源)に、意図的に過剰な負荷をかけたり脆弱性をついたりする事でサービスを妨害します。
@csrf
ディレクティブ
上記のようなサイバー攻撃を防止するために用意されたのが@csrf
です。
@csrf
は、「トークン」と呼ばれるランダムな文字列を非表示フィールドとしてフォームに追加し、トークンの値が正しいフォームのみを受け付けるようにします。
こうすることで、用意されたフォームからの送信なのかどうかを見分けることができ、正しいフォーム以外からの不正な送信を阻止することが可能になります!
参考サイト
・参考にしたQiita記事
https://qiita.com/taka_no_okapi/items/fb4bbe59c18eeaf5a043
・Laravel公式ドキュメント
https://readouble.com/laravel/8.x/ja/csrf.html
・クロスサイトリクエストフォージェリについて
https://www.trendmicro.com/ja_jp/security-intelligence/research-reports/threat-solution/csrf.html