web-dev-qa-db-ja.com

Laravel 5.7、laravel 5.8でのリクエストの投稿---エラー-419申し訳ありませんが、セッションの有効期限が切れています

Laravel 5.7をインストールしました

ファイルにフォームを追加しました\resources\views\welcome.blade.php

<form method="POST" action="/foo" >
    @csrf
    <input type="text" name="name"/><br/>
    <input type="submit" value="Add"/>
</form>

ファイル\routes\web.phpに追加しました

Route::post('/foo', function () {
    echo 1;
    return;
});

POSTリクエストを送信した後:

419申し訳ありませんが、セッションの有効期限が切れています。更新してもう一度お試しください。

バージョン5.6では、そのような問題はありませんでした。

以下を読む前に、フォームに@csrfまたは{{ csrf_field() }}があることを確認してください

<form method="post">
@csrf <!-- {{ csrf_field() }} -->
... rest of form ...
</form>

セッション期限切れエラーメッセージが表示されるのは、csrfトークンの検証がどこかで失敗したためです。つまり、App\Http\Middleware\VerifyCsrfToken::classミドルウェアがすでにオンになっています。フォームには@csrfブレードディレクティブが既に追加されていますが、これでも問題ありません。

次に、確認する他の領域はセッションです。 csrfトークンの検証はセッションに直接関係するため、不適切に構成されたRedisが問題を引き起こす可能性があるなど、セッションドライバーが機能しているかどうかを確認することをお勧めします。

セッションドライバー/ソフトウェアを.envファイルから切り替えてみることもできます。サポートされているドライバーは以下のとおりです

Laravel 5.7でサポートされているセッションドライバ (Doc Link)

  • file-セッションはstorage/framework/sessionsに保存されます。
  • cookie-セッションは、暗号化された安全なCookieに保存されます。
  • database-セッションはリレーショナルデータベースに保存されます。
  • memcached/redis-セッションは、これらの高速なキャッシュベースのストアのいずれかに保存されます。
  • array-セッションはPHP配列に保存され、永続化されません。

セッションドライバーを切り替えた後、フォームが機能する場合は、その特定のドライバーに何か問題があります。そこからエラーを修正してください。

エラーが発生しやすいシナリオ

  • おそらく/storageディレクトリのアクセス許可の問題のため、ファイルベースのセッションが機能しない可能性があります(クイックグーグルで解決策を取得します)

  • データベースドライバーの場合、DB接続が間違っているか、sessionsテーブルが存在しないか、正しく構成されていない可能性があります(@Junaid Qadirのコメントにより、誤った構成部分が問題であることが確認されました)。

  • redis/memcached設定が間違っているか、システム内の他のコードによって同時に操作されています。

php artisan key:generateを実行し、セッションデータをフラッシュする新しいアプリキーを生成することをお勧めします。

ブラウザのキャッシュをクリアHARD、chromeとfirefoxが原因であることがわかりました。

アプリケーションキーが重要である理由について詳しく読む

60
Shobi

これは、フォームにcsrfが必要なためです。バージョン5.7では、@ csrfに変更しました

<form action="" method="post">
    @csrf
    ...

リファレン: https://laravel.com/docs/5.7/csrf

26
David

ケース1:127.0.01:8000のようなローカルシステムでプロジェクトを実行している場合、

それから

.envファイルにSESSION_DOMAIN=を追加します

またはconfig/session.php 'domain' => env('SESSION_DOMAIN', ''),

php artisan cache:clearを実行します

ケース2:プロジェクトがサーバーで実行されており、「mydomain.com」のようなドメインがある場合

.envファイルにSESSION_DOMAIN=mydomain.comを追加します

またはconfig/session.php 'domain' => env('SESSION_DOMAIN', 'mydomain.com'),

php artisan cache:clearを実行します

8
Saurabh Mistry

Laravelを使用します5.7同じ問題が発生しました。csrfトークンがフォームになかったためです。

@csrf

問題を修正しました

7
Karim Samir

使い方はどうですか

@csrfの代わりに{{ csrf_field() }}

419エラーのほとんどは、csrfトークンの問題が原因です。

4
Bonish Koirala

\App\Http\Middleware\EncryptCookies::class\app\Http\Kernel.phpをコメントアウトしてみてください。同様の問題があり、そうすることで解決しました。おそらくセキュリティが機能するため、最良のソリューションではありません。

以前私が試した:

  • キャッシュの消去
  • 新しいアプリキーを生成する
  • さまざまなブラウザー(Chrome 70、Mozilla Firefox 57、およびIE 11)でアプリを実行します
  • 別のコンピューターでアプリを実行する
  • \App\Http\Middleware\VerifyCsrfToken::class\app\Http\Kernel.phpをコメントアウトします
  • \Illuminate\Session\Middleware\AuthenticateSession::class\app\Http\Kernel.phpをコメントアウトします
  • Laravelのアップグレードとダウングレード(5.6〜5.7)

しかし、上記のどれも私にとってはうまくいきませんでした。

編集

ここでの私の場合は、ログインするたびに新しいセッションファイルが作成され(古いセッションファイルはまだ残っていますが、突然忘れられます。storage/framework/sessionsを確認してください)、新しいCSRFトークンが生成されます。したがって、問題はVerifyCsrfTokenにはありません。

@Vladdがコメントセクションで言及したように、決してコメント\App\Http\Middleware\VerifyCsrfToken::classする必要があります。正しいCSRFトークンをサーバーに送信したことを確認する必要があります。

4
Prasna Lukito

welcome.blade.phpの@csrf<input type="hidden" name="_token" value="{{ csrf_token() }}">に変更します

あなたのコードは次のようになります:

<form method="POST" action="/foo" >
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
    <input type="text" name="name"/><br/>
    <input type="submit" value="Add"/>

   <button type="submit">Submit</button>
</form>
4
Aghnat Atqiya

あなたのHttp/Kernel.php

この行をコメントしてみてください:

\Illuminate\Session\Middleware\AuthenticateSession::class,

webミドルウェアアレイ内

それはあなたの問題の根本かもしれません

2
Mathieu Ferre

かなりの時間の後、私はそれをこのように解決しました

laravelインストールパスは、設定ファイルsession.phpで設定されたものと同じではありませんでした

'domain' => env('SESSION_DOMAIN', 'example.com'),
1
ismail bangee

コードに問題はありません。新規インストールで作成したコードと同じコードで確認しました。

フォームコード:

<form method="POST" action="/foo" >
    @csrf
    <input type="text" name="name"/><br/>
    <input type="submit" value="Add"/>
</form>

web.phpファイルコード:

Route::get('/', function () {
    return view('welcome');
});

Route::post('/foo', function () {
    echo 1;
    return;
});

フォームを送信した後の結果は次のとおりです。 Output after submitting the form

ブラウザのキャッシュをクリアするか、他のブラウザで試してみると、修正されると思います。

1

デフォルトでは、この問題はありませんでした。したがって、私がしたことは、問題を再現するためのchmod -R 644 sessionsです。

enter image description here

その後、chmod -R 755 sessionsによってセッションフォルダーにアクセス許可を付与しました

今、私のプロジェクトコードは再び動作します。

enter image description here

書き込み権限のないファイルにキャッシュを保存していることが原因です。

セッション構成ファイルはconfig/session.phpに保存されます。このファイルで使用可能なオプションを必ず確認してください。デフォルトでは、Laravelはファイルセッションドライバーを使用するように設定されており、多くのアプリケーションでうまく機能します。本番アプリケーションでは、セッションのパフォーマンスをさらに高速化するために、memcachedまたはredisドライバーの使用を検討できます。

ソリューション:

1-上記で修正したように、セッションフォルダーに755の許可を与えることができます。 2-別のセッションドライバー構成を使用できます。

ファイル-セッションはstorage/framework/sessionsに保存されます。 cookie-セッションは安全な暗号化されたcookieに保存されます。データベース-セッションはリレーショナルデータベースに保存されます。 memcached/redis-セッションは、これらの高速なキャッシュベースのストアのいずれかに保存されます。配列-セッションはPHP配列に格納され、永続化されません。

覚えておいてください。 memcached/redisを使用する場合は、サーバーにインストールするか、docker redisコンテナーが実行されている必要があります。

1
Anar Bayramov

私はまったく同じ問題を抱えていたが、それは完全に愚かであることにかかっていた。上記のフォームを送信する前に、javascriptを介して(送信ボタンだけでなく)すべてのフォームフィールドを無効にしました。これにより、当然、すべてのフォーム要素が送信されず(非表示の_tokenフィールドを含む)、419エラーが発生しました。

これが、数時間の頭の傷から誰かを助けることを願っています!

無効なフォーム入力はリクエストに表示されません

0
Splodge

私の場合、それは非常にばかげています。 Auth::routes()をルートファイルの先頭に配置すると、エラー419が発生します。

Auth::routes();

Route::middleware('auth')->group(function () {
    Route::get('/', 'DashboardController@index')->name('dashboard');
});

そして、Auth::routes();をルートファイルの一番下に移動してエラーを修正しました。

Route::middleware('auth')->group(function () {
    Route::get('/', 'DashboardController@index')->name('dashboard');
});

Auth::routes();

おそらくあなたのケースにも役立つかもしれません。幸運を。

0
lyhong

Laravel 5.6以降で空のリターンを行うことはできません。 Laravelは常に値が返されることを想定しています。 (私は過去の経験から知っています)。これは主に、PHP 7が空の戻り値を処理する方法に関係しています。

0
Jamie Ross

やり過ぎかもしれませんが、これを試すことができます:

//フォーム呼び出し名前付き隠されたトークンフィールドが追加されたルート。

<form method="POST" action="{{ route('foo') }}" >
    @csrf
    <input type="hidden" name="_token" value="{!! csrf_token() !!}">
    <input type="text" name="name"/><br/>
    <input type="submit" value="Add"/>
</form>

// 名前付きルート

Route::post('/foo', function () {
    return 'bar';
})->name('foo');

// <head></head>ブロック内にこれを追加します:

<meta name="_token" content="{!! csrf_token() !!}" />

Laravelインストーラー2.0.1を使用して新規インストールされたLaravel 5.7でHomesteadを使用してローカルでテストし、機能しました。あなたの環境は何ですか?

理論:それは、あなたの環境で{{ }} vs. {!! !!}を使用してhtmlタグをレンダリングするブレードと関係があるのか​​、それをどのように提供しているのか(たとえばphp artisan serve)。それがline 335 of /vendor/laravel/framework/src/illuminate/Foundation/helpers.phpであると私に思わせるのは、上記で手動で入力した同じ行をレンダリングするべきです。

0
jeremykenedy

私はずっと前にこの問題を見つけました。 storage/framework/sessionsの許可を引き起こすことを思い出しました。 chmod -R 0777 storage/framework/sessionsコマンドで変更することもできます。それは私のために働いた。

0
Leo Nguyen

投稿ファイルのサイズ制限を超える大きなファイルをアップロードしようとすると、エラー419が表示されることに注意してください。この場合、upload_max_filesizeとpost_max_sizeの両方を妥当な量に増やすことができます(たとえば、10Mまたは20Mはユースケースとリソースに依存します)。ここでチェックしてください: https://stackoverflow.com/a/2184541/2100489

ただし、これにより、帯域幅やストレージなどのリソース消費の問題が発生する可能性があります。解決策として、フォームを送信する前にファイルサイズを確認し、警告メッセージを表示できます。

0
Kiafar

それをそこに出すために、私は同じ問題を抱えていました。私のローカルのホームステッドでは、期待どおりに動作しますが、開発サーバーにプッシュした後、セッションタイムアウトメッセージも取得しました。環境の問題を考えると、Apacheからnginxに変更され、奇跡的に問題がなくなりました。

0
Kees Hessels

実際、SCRFはセッションベースのトークンです。ルートグループにルートを追加し、セッションを制御するミドルウェアを追加します。

webはlaravelのデフォルトのミドルウェアであり、セッションリクエストを制御できます。

Route::group(array('middleware' => ['web']), function () {
  Route::post('/foo', function () {
     echo 1;
     return;
  });
});
0
Zia

手っ取り早いアプローチは、app\http\middleware\verifycsrftoken.phpに移動し、$ exceptリストにルートを追加することです。ポストリクエストは、CSRFトークンの検証に適しています。

protected $except = [
    //
    'doLogin.aspx',
    'create_coupon',
];
0
Qasim Ali