私はLaravelを使い始めたばかりで、理解できない問題があります。私のプロジェクトにはログフォームがあり、私の方法は _ post _ です。リクエストしようとすると、結果は次のようになります。
'ページが非アクティブなため期限切れです。更新してもう一度やり直してください。
しかし、メソッドを _ get _ に変更すれば、うまくいきます。
それがなぜなのか、そしてそれをどう修正するのか、誰かに教えてもらえますか?もちろんPOSTメソッドが必要です。
この問題は失敗するCSRFトークン検証から来ます。ですから、投稿していないか、間違った投稿をしているのでしょうか。
それがGETのために働く理由はLaravelのGETルートのために、掲示されたCSRFトークンがないということです。
次のように呼び出して、CSRFトークンをフォームに投稿することができます。
{{ csrf_field() }}
またはapp/Http/Middleware/VerifyCsrfToken.php
であなたのルート(セキュリティ上の理由により推奨されません)を除外します。
protected $except = [
'your/route'
];
私の場合は、同じエラーメッセージが表示され、フォームフィールドにcsrf_token
を追加しなかったことがわかりました。それからcsrf_token
を追加してください。
フォームヘルパーを使うと、
{{ csrf_field() }}
あるいはフォームヘルパーなしでは、
<input type="hidden" name="_token" value="{{ csrf_token() }}">
それでもうまくいかない場合は、
ブラウザのキャッシュを更新する
そして今、それはうまくいくかもしれません、ありがとう。
Laravel 5.6用に更新
Laravelは{{ csrf_field() }}
の代わりに新しい@csrf
を統合します。それは今もっと素敵に見えます。
<form action="">
@csrf
...
</form>
アプリケーションにHTMLフォームを定義するときはいつでも、CSRF保護ミドルウェアが要求を検証できるように、フォームに隠しCSRFトークンフィールドを含める必要があります。 tokenフィールドを生成するためにcsrf_field
ヘルパーを使うことができます:
<form method="POST" action="/profile">
{{ csrf_field() }}
...
</form>
うまくいかない場合は、ブラウザのキャッシュを更新するとうまくいきます。
オープンリンク: - Laravel 5.5におけるCSRF保護 -
更新:
Bladesテンプレートを使用してLaravel 5.6を使用すると、非常に簡単です。
<form method="POST" action="/profile">
@csrf
...
</form>
詳細については、次のリンクをクリックしてください。 - Laravel 5.6のCSRF保護
Config/session.phpファイルにこの行が含まれていることを確認してください。
'domain' => env('SESSION_DOMAIN', null),
次に、.envファイルのSESSION_DOMAIN
行を削除します。
これは、Laravelのインストールに含まれるデフォルトのCSRVミドルウェアを使用しているために起こります。解決するために、Kernel.phpからこの行を削除してください:
\App\Http\Middleware\VerifyCsrfToken::class,
あなたがAPIを構築しているなら、これは問題ありません。ただし、Webサイトを構築している場合、これはセキュリティ検証であるため、そのリスクに注意してください。
成功せずに数週間問題を解決するためにさまざまな解決策を試みました。
私が直面していた問題は、laravel 5.0から5.5にアップグレードしてconfig/session.phpを更新するのを忘れたことが原因でした。
誰かが問題に直面している場合は、実行しているLaravelのバージョンと一致するようにconfig/session.phpを更新してください。
私は同じ問題を抱えていた。クロームで「閲覧履歴データをクリア」を使用します。多分あなたの問題を解決しなさい。
設定がSESSION_DRIVER = fileに設定されている場合は、セッションディレクトリが書き込み可能かどうかを確認する必要があります。ストレージ/フレームワーク/セッションを確認してください
私は同じエラーに直面していたので、私はちょうど私の.envファイルからこの行を削除しました
SESSION_DRIVER = yourwebsite.com
このコードをフォーム内に配置するだけです
<input type = "hidden" name = "_token" value = "<?php echo csrf_token() ?>" />
私の場合は、ob_start()を追加しました。私の index.php 上のサーバー上で、すべてがうまくいっているようです。
それでもだれでもこの問題を抱えています、あなたのフォームの中で以下のように次のコードを使ってください。
echo '<input type = "hidden" name = "_token" value = "'. csrf_token().'" >';
まず、あなたのフォームにcsrfを含めます。
{{ csrf_field() }}
問題が解決しない場合は、index.phpの最初の部分でob_start();
を使用してください。
<?php ob_start();
CSRF保護からURIを除外する:
CSRF保護から一連のURIを除外したい場合があります。たとえば、Stripeを使用して支払いを処理し、そのWebhookシステムを利用している場合、Stripeは自分のルートに送信するCSRFトークンを認識しないため、Stripe WebhookハンドラルートをCSRF保護から除外する必要があります。
通常、RouteServiceProviderがroutes/web.phpファイル内のすべてのルートに適用されるWebミドルウェアグループの外側にこれらの種類のルートを配置する必要があります。ただし、VerifyCsrfTokenミドルウェアの$ exceptプロパティにURIを追加して、ルートを除外することもできます。
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
class VerifyCsrfToken extends Middleware
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
'stripe/*',
'http://example.com/foo/bar',
'http://example.com/foo/*',
];
}
それはおかしいですがそれは私のために働きます。私はこれがlaravelコードのデフォルトのHTML TAGのために引き起こされることに気づきました。代わりに/ * * /または{{ - - }}を使用してください。
または、最近削除されたHTMLコードを削除しようとしています...またはHTMLコメントをPhpコメントに変更してください...またはphp artisan clean browserなどのWorng artisanコマンドを実行してみてください。 ..
javascriptで form action を変更する必要がある場合は、同じ問題が発生します。
1. first laravelでは{!!Form::open() !!} {!! close() !!}
の代わりに使う必要があります
2. second あなたは一番https://www.example.com +your Route
で行動を始めます
あなたのURLにwwwを忘れないでください!
それはあなたの形では持っていないcsrfトークンかもしれません。 @crsf
か{{ csrf_field() }}
を使わなければなりません
フォームにcsrfを使用している場合キャッシュかもしれません。アプリのキャッシュを消去します。
php職人のキャッシュ:クリア
php職人の意見:クリア
php職人のキャッシュ:クリア
そしてブラウザのキャッシュをクリアしてください。
php職人の鍵:生成する
フォームに CSRFトークン が既に含まれている場合その後、おそらくあなたのフォームのキャッシュデータが原因でエラーページが表示されます。
あなたのterminal/commandプロンプトを開き、あなたのプロジェクトルートでこれらのコマンドを実行してください。
php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear
、また、これらのコマンドを実行しながら、 ブラウザのキャッシュを消去する を試みてください。
私は同じ問題を抱えていた、私は多くの解決策を試してみました。しかし、どれも私のために働きませんでした。それから私は何らかの理由で私が私の.envファイルでこれを使用していたことがわかった:
SESSION_DOMAIN = myapp.me
私がそれをnullに戻すとすぐに、すべてがうまくいった。
formタグに@csrf
を追加するだけで私の問題は解決しました
Laravel 5.6
は{{ csrf_field() }}
をサポートしていません{{ csrf_field() }}
の代わりに@csrf
を追加するだけです
larvel_fix_error.png
私の場合、隠し入力フィールドの最後に>
を追加するのを忘れたので、同じ問題が起こりました。<input type="hidden" name="_token" value="{{ Session::token() }}"
だから、私はそれを追加することでそれを修正しました:
<input type="hidden" name="_token" value="{{ Session::token() }}">
動作させました / Auth :: routes()を使用する代わりにRouter.phpからルートをコピーすることによって、これらはあなたが必要とするルートです:
Route::get('login', 'Auth\LoginController@showLoginForm')->name('login');
Route::post('login', 'Auth\LoginController@login');
Route::post('logout', 'Auth\LoginController@logout')->name('logout');
// Registration Routes...
Route::get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
Route::post('register', 'Auth\RegisterController@register');
// Password Reset Routes...
Route::get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
Route::post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
Route::get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
Route::post('password/reset', 'Auth\ResetPasswordController@reset');
私はこの質問が十分に答えられたということを知っています、しかし私は私の場合に働いた修正を述べることを望みました。 {{ csrf_field() }}
を追加しましたが、まだ動作しませんでした。
それから私は、開発目的のためにすべてのクッキーをブロックしたことを思い出しました。
設定を変更してMS Edge browser
内のすべてのクッキーのブロックを停止すると、問題は解決しました。
Formタグの中に@csrf
を追加するだけです。
あるいはヘッダにcsrf_token
を含めてリクエストごとに送信することもできます。