「ページは非アクティブのため期限切れになりました」-Laravel 5.5


111

私の登録ページは、フォームにCsrfToken({{ csrf_field() }})が存在する状態でフォームを適切に表示しています。

フォームHTML

<form class="form-horizontal registration-form" novalidate method="POST" action="{{ route('register') }}">
        {{ csrf_field() }}
        ....
</form>

ユーザーに組み込み認証を使用しています。ルートとリダイレクト以外は何も変更していません。

フォームを送信すると(リロード直後も)、非アクティブのためページが期限切れになったと表示されます。更新してもう一度お試しください。エラー。

私は非常に小さなことを逃しています。しかし、それが何かはわかりません。何か助けは?

更新

問題が見つかりました。セッションドライバが配列に設定されました。ファイルに変更すると、エラーはなくなりました。しかし、配列を使用するとどうなりますか?


storage_pathが書き込み不可であることと関係がある可能性があります。これは、ファイルベースのセッションを使用している場合、トークンに関するセッションデータを格納する場所です。
Devon

1
問題が見つかりました。セッションドライバーはに設定されましたarray。ファイルに変更すると、エラーはなくなりました。しかし、配列を使用するとどうなりますか?
Sougata Bose


1
新しいバージョンのlaravelの場合、@ csrfを使用して問題を解決します。
Vuong Tran

回答:


164

検索から直接この回答にアクセスする{{ csrf_field() }}場合は、OP と同様に、フォームにcsrfトークンがすでに追加されていることを確認してください。


セッションドライバーをファイルに設定している場合:

storage_pathが書き込み不可であることと関係がある可能性があります。これは、ファイルベースのセッションを使用している場合、トークンに関するセッションデータを格納する場所です。で確認できますis_writable(config('session.files'))


OPの場合、セッションドライバーは配列に設定されました。 アレイはテスト専用です。データは永続化されないため、次のリクエストでトークンを比較できません。

アレイドライバーはテスト中に使用され、セッションに保存されたデータが保持されないようにします。

https://laravel.com/docs/5.5/session#configuration


config / session.phpを確認してください

最後に、私が抱えていた問題、config / session.phpにセッションドメインと安全な設定があるプロジェクトがありましたが、開発サイトはHTTPS(SSL / TLS)を使用していませんでした。これにより、sessions.secureがデフォルトでtrueに設定されていたため、この一般的なエラーが発生しました。


3
OK。しかし今のところそれは開発中です。では、配列を使用すると、なぜエラーが発生したのですか?
素形ボーズ2017

@SougataBoseテストは開発ではありません。配列データは永続化されません...
Devon

それが、DOCを適切に通過する必要がある理由です.. :)
Sougata Bose

私の問題は解決されませんでした。本当に基本をやった。しかし、私はカスタムプロバイダーとサービスを使用しています。コントローラーメソッドを呼び出しても問題はありませんが、postリクエストで呼び出されたコントローラーでサービスメソッドを実行すると、問題が発生します。
Behnam Azimi

1
セッションに関してもテストに関して同様の問題がありました。私がCarbon::setTestNow($time);テストで使用していたときに判明しましたが、Carbon::setTestNow();後で使用してそれをクリアしていませんでした。
riotCode

77

Laravel 5.5でも同じ問題が発生しました。私の場合、ルートをGETからPOSTに変更した後に発生しました。問題は、POSTに切り替えたときにCSRFトークンを渡すのを忘れたためです。

次の呼び出しにより、フォームにCSRFトークンを投稿できます。

 {{ csrf_field() }}

またはapp / Http / Middleware / VerifyCsrfToken.phpでルートを除外します

 protected $except = [
        'your/route'
    ];

2
csrf_field()フォームに存在します。受け入れられた回答は問題を説明しています。ありがとう。
そうがたボーズ2017

1
私の場合、サードパーティからPOSTを受け取っていたため、csrf_field()を追加することはできませんでした。私の場合、CSRFは要因ではなかったので、このルートに例外を追加すると問題が解決しました。ありがとう。
ファビオ・デュケ・シルバ

私の問題は解決されませんでした。本当に基本をやった。しかし、私はカスタムプロバイダーとサービスを使用しています。コントローラーメソッドを呼び出しても問題はありませんが、postリクエストで呼び出されたコントローラーでサービスメソッドを実行すると、問題が発生します。
Behnam Azimi 2017

1
CSRF検証を無効にしないでください!保護することは非常に重要です。トークンを適切に送信し、ログインしたユーザーに代わってアクションを送信できる悪意のあるJavaScriptからユーザーを保護する方法を学びます。
デボン



6

私のケースはで解決SESSION_DOMAINされましたxxx.localhost。私のローカルマシンではに設定する必要がありました。これは、生産との競合を引き起こしていたSESSION_DOMAINxxx.comsession.php設定ファイルに直接設定されました。


使用していたセッションドライバは何ですか?fileまたはcookie
KeitelDOG 2018

4

一部の情報は、開発中の旧バージョンのlaravelに関連するcookieに保管されます。したがって、他のバージョンによって生成されたcsrf生成トークンと競合しています。クッキーをクリアして試してみてください。


<input type="hidden" name="_token" value="Umr1AlG3sScdUWGtMoHcQPPKASsR7qsd5ZE1H3Xv">生成されたHTMLでコードの種類を確認できましたか?
Suresh Velusamy 2017

あります。問題が見つかりました。セッションドライバが配列に設定されました。ファイルに変更すると、エラーはなくなりました。
そうがたボーズ2017

4

まだ問題があり、何の助けもない人のために。php.iniのmbstring.func_overloadパラメータに注意してください。0に設定する必要があります。また、mbstring.internal_encodingをUTF-8に設定します。私の場合、それは問題でした。


どうもありがとうございました!あなたの答えはクラッシュから私の脳を救いました)
Rustembek Kaliyev

3

ストレージへのアクセス許可を変更しましたが、エラーはなくなりました。許可の欠如が問題だったようです。

sudo chmod -R 775 storage/

2
このようなオープンなアクセス許可を再帰的に使用するように注意してください。ファイルには775を強くお勧めします。ディレクトリは755、ファイルは644が標準です。
デボン、

3

@csrfフォームに追加し、VerifyCsrfToken.phpにも移動します

app-> Http-> Middleware-> VerifyCsrfToken.php

protected $except = [
        'paste your route here'
    ];

1

私の場合、サイトはサーバーでは問題ありませんでしたが、ローカルでは問題ありませんでした。それから私は安全なウェブサイトに取り組んでいたことを覚えています。
ファイルconfig.session.phpで、変数secureをfalseに設定します

'secure' => env('SESSION_SECURE_COOKIE', false),

0

私は複数のサブドメインを持つアプリを持っていて、セッションCookieはそれらの間の問題でした。Cookieをクリアすると問題が解決しました。

また、設定してみてくださいSESSION_DOMAIN.envファイル。閲覧している正確なサブドメインを使用します。


0

Webサーバーのシステム時刻が正しいことを確認してください。私の場合、迷惑なマシンは未来(Jan 26 14:08:26 UTC 2226)だったので、もちろん、ブラウザーのセッションCookieの時間は約200年以上前に期限切れになりました。



0

私はこれらのエラーを回避する2つの解決策を見つけました1)保護された$ except = ['/ yourroute']を追加することにより、定義されたルートからcsrfトークンインスペクションを無効にします。2)カーネルの保護されたミドルウェアグループの\ App \ Http \ Middleware \ VerifyCsrfToken :: class行をコメント化する


0

同じ問題がありましたが、問題はフレームワークではなくブラウザにあります。理由はわかりませんが、私の場合、google chromeがcookieを自動的にブロックします。Cookieを許可した後、問題は解決しました。


0

短い答え

以下のためのルートエントリの追加registerでのapp/Http/Middleware/VerifyCsrfToken.php

protected $except = [
        '/routeTo/register'
    ];

次のコマンドを使用して、キャッシュとキャッシュルートをクリアします。

php artisan cache:clear && php artisan route:clear

細部

Laravelサイトにアクセスするたびに、セッションが開始されていなくてもトークンが生成されます。次に、各要求で、このトークン(Cookieに格納されている)はSESSION_LIFETIMEconfig/session.phpファイルのフィールドに設定されている有効期限に対して検証されます。

有効期限よりも長い間サイトを開いたままにしてリクエストを行おうとすると、このトークンが評価され、有効期限エラーが返されます。したがって、認証されたユーザーの機能(登録やログインなど)の外部にあるフォームでこの検証をスキップするには、exceptルートをに追加できますapp/Http/Middleware/VerifyCsrfToken.php


1
そのページがユーザー入力を処理する場合は、CSRFチェックを実行する必要があります。
素形ボーズ

@SougataBose確かに、その場合、GoogleのreCAPTCHAとしてキャプチャバリデーターを使用するのが最善だと思います
JC Gras

0

バックデートでプロジェクトをテストしているため、何度も発生します


0

解決:

シークレットモードの新しいタブを使用してから、もう一度テストしてください。

理由:

私の場合、別のユーザーが私の管理パネルでログインしました

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.