質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

2回答

2463閲覧

Laravel7/419ページエラーが発生してしまう件( CSRF対策が原因か?)

ogurina

総合スコア0

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/05/25 23:06

前提・実現したいこと

開発環境:cloud9、Laravel7.10 経験:今回が初めてのアプリ制作の初学者
投稿機能を作成し、<form>タグからPOSTでメッセージを渡し、投稿内容を表示させるまでを実装したい。

発生している問題・エラーメッセージ

入力フォームで受け取ったデータを送る際に、419のページエラーが発生してしまう。
PHPを学び、Laravelを使って初めて製作に取り掛かったため経験が浅く、質問内容に抜けがありましたらご指摘いただければ幸いです。

◆実際の画面
・投稿入力フォーム
イメージ説明

・エラー画面 ※入力フォームを空の状態でもsubmitを実行してみましたが、同様のエラーが表示されてしまいました。
イメージ説明

◆対象のコード
・formタグ
イメージ説明

・コントローラー処理
イメージ説明

・POSTで受け取ったデータの表示
イメージ説明

試したこと

CSRF対策がうまく動作していないためのエラーかと推測。元々、{{ csrf_field() }}でコードを書いていたが、どうやらLaravelのバージョンが高い場合には、@CSRFで書く必要がありそう。@CSRFに書き換えるも同様のエラーが表示されてしまう。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

対象のviewファイル、もしくは使っているテンプレートに
<meta name="csrf-token" content="{{ csrf_token() }}">
は入っていますか?

投稿2020/05/26 01:38

noborino078

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ogurina

2020/05/26 22:22

ご回答いただきありがとうございます。 Blade機能を用いて、layoutファイルを作成しておりまして、formタグのコードはそちらのファイルを読み込むようにして整えています。 layoutファイルの<head>内を確認したのですが、教えていただいたコードを書いてありました。 その他に考えられる原因はありますでしょうか?
yuuAn

2020/06/01 07:48

meta タグに入れるのは JS から使うためなので、今回の件とは関係なさそうです。
guest

0

App\Http\Kernel, App\Providers\RouteServiceProvider, routes/web.php 辺りはいじってませんか?
これらの場所に Middleware の設定があるのですが、Laravel では、CSRF トークンを保存するのに使われているセッションを有効にするのも、CSRF トークンのチェックを行うのも、Middleware で実現されているので、他が間違ってないとしたらこの辺りが怪しいと思いました。

https://github.com/laravel/framework/blob/7.x/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php#L134-L141

php

1 /** 2 * Determine if the session and input CSRF tokens match. 3 * 4 * @param \Illuminate\Http\Request $request 5 * @return bool 6 */ 7 protected function tokensMatch($request) 8 { 9 $token = $this->getTokenFromRequest($request); 10 11 return is_string($request->session()->token()) && 12 is_string($token) && 13 hash_equals($request->session()->token(), $token); 14 }

CSRF トークンはここでチェックして、ダメだった場合は TokenMismatchException を投げ、例外ハンドラ で try-catch して 419 を返しています。

vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.phpdd() を仕込んでみると、CSRF トークンがマッチしなかった直接の原因が解ると思います。

$request->session()->token() が空っぽだったらセッションの問題、$this->getTokenFromRequest($request) の返り値が空だったらリクエストの問題というように。

vendor/ の中身は Git で管理していないと思うので、デバッグが終わった後、元に戻すのを忘れないようにしてください。

なお、@csrfcsrf_field()変換される ので、どちらで書いても結果は同じです。
(便利な書き方を用意しただけで、古い書き方を廃止する訳ではないようです)

投稿2020/06/01 08:13

yuuAn

総合スコア44

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問