"Die Seite ist aufgrund von Inaktivität abgelaufen" - Laravel 5.5


111

Meine Registrierungsseite zeigt das Formular korrekt mit CsrfToken an ({{ csrf_field() }} ) im Formular vorhanden ist.

Form HTML

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

Ich verwende die integrierte Authentifizierung für die Benutzer. Haben nichts außer den Routen und Weiterleitungen geändert.

Wenn ich das Formular abschicke (auch kurz nach dem erneuten Laden), wird angezeigt, dass die Seite aufgrund von Inaktivität abgelaufen ist. Bitte aktualisieren und erneut versuchen. Error.

Ich vermisse eine sehr kleine Sache. Aber nicht sicher, was es ist. Irgendeine Hilfe?

Aktualisieren

Fand das Problem. Der Sitzungstreiber wurde auf Array gesetzt. Es wurde in eine Datei geändert und der Fehler ist jetzt behoben. Aber was ist falsch, wenn ich Array verwende?


Kann etwas damit zu tun haben, dass der Speicherpfad nicht beschreibbar ist. Hier werden Sitzungsdaten zu Token gespeichert, wenn Sie dateibasierte Sitzungen verwenden.
Devon

1
Fand das Problem. Der Sitzungstreiber wurde auf eingestellt array. Es wurde in eine Datei geändert und der Fehler ist jetzt behoben. Aber was ist falsch, wenn ich Array verwende?
Sougata Bose


1
Verwenden Sie für eine neue Version von Laravel @csrf, um das Problem zu lösen.
Vuong Tran

Antworten:


164

Wenn Sie direkt von einer Suche zu dieser Antwort kommen , stellen Sie sicher, dass Sie das csrf-Token bereits {{ csrf_field() }}wie das OP zu Ihrem Formular hinzugefügt haben .


Wenn Sie Ihren Sitzungstreiber auf Datei eingestellt haben:

Kann etwas damit zu tun haben, dass der Speicherpfad nicht beschreibbar ist. Hier werden Sitzungsdaten zu Token gespeichert, wenn Sie dateibasierte Sitzungen verwenden. Das kann mit überprüft werdenis_writable(config('session.files'))


Für das OP wurde der Sitzungstreiber auf Array gesetzt. Das Array dient nur zum Testen. Da die Daten nicht beibehalten werden, kann das Token bei der nächsten Anforderung nicht verglichen werden.

Der Array-Treiber wird während des Tests verwendet und verhindert, dass die in der Sitzung gespeicherten Daten beibehalten werden.

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


Überprüfen Sie config / session.php

Als letztes Problem hatten wir ein Projekt mit der Sitzungsdomäne und den sicheren Einstellungen in config / session.php, aber die Entwicklungssite verwendete kein HTTPS (SSL / TLS). Dies verursachte diesen generischen Fehler, da session.secure standardmäßig auf true gesetzt war.


3
OK. Aber im Moment ist es in der Entwicklung. Wenn ich also ein Array verwende, warum gab es mir diesen Fehler?
Sougata Bose

@ SougataBose-Tests sind keine Entwicklung. Array-Daten werden nicht beibehalten ...
Devon

Das ist der Grund, warum man die DOCs richtig durchgehen sollte .. :)
Sougata Bose

Mein Problem wurde nicht gelöst. Ich habe die Grundlagen wirklich gemacht. Aber ich benutze benutzerdefinierte Anbieter und Dienste. Es gibt kein Problem, wenn ich eine Controller-Methode aufrufe, aber wenn ich eine Servicemethode in einem Controller ausführe, der mit einer Post-Anfrage aufgerufen wurde, tritt das Problem auf!
Behnam Azimi

1
Ich hatte ein ähnliches Problem mit Sitzungen, aber in Bezug auf das Testen. Es stellte sich heraus, dass ich es bei der Verwendung Carbon::setTestNow($time);in den Tests nicht durch anschließende Verwendung Carbon::setTestNow();gelöscht habe.
RiotCode

77

Ich bin in Laravel 5.5 auf dasselbe Problem gestoßen. In meinem Fall geschah dies nach dem Ändern einer Route von GET zu POST. Das Problem war, dass ich vergessen habe, ein CSRF-Token zu übergeben, als ich zu POST gewechselt bin.

Sie können entweder ein CSRF-Token in Ihrem Formular veröffentlichen, indem Sie Folgendes aufrufen:

 {{ csrf_field() }}

Oder schließen Sie Ihre Route in app / Http / Middleware / VerifyCsrfToken.php aus

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

2
csrf_field()in der Form vorhanden. Die akzeptierte Antwort beschreibt das Problem. Vielen Dank.
Sougata Bose

1
In meinem Fall erhielt ich einen POST von einem Drittanbieter, daher war das Hinzufügen von csrf_field () keine Option. Da CSRF in meinem Fall kein Faktor war, löste das Hinzufügen einer Ausnahme zu dieser Route das Problem. Vielen Dank.
Fábio Duque Silva

Mein Problem wurde nicht gelöst. Ich habe die Grundlagen wirklich gemacht. Aber ich benutze benutzerdefinierte Anbieter und Dienste. Es gibt kein Problem, wenn ich eine Controller-Methode aufrufe, aber wenn ich eine Servicemethode in einem Controller ausführe, der mit einer Post-Anfrage aufgerufen wurde, tritt das Problem auf!
Behnam Azimi

1
Bitte deaktivieren Sie die CSRF-Überprüfung nicht! Es ist sehr wichtig, Schutz zu haben. Erfahren Sie, wie Sie das Token ordnungsgemäß senden und Ihre angemeldeten Benutzer vor böswilligem Javascript schützen, das in ihrem Namen Aktionen senden kann.
Devon



6

Mein Fall wurde gelöst mit SESSION_DOMAIN, in meinem lokalen Computer musste eingestellt werden xxx.localhost. Es verursachte Konflikte mit der Produktion SESSION_DOMAIN, xxx.comdie direkt in der Konfigurationsdatei session.php festgelegt wurde.


Welchen Sitzungstreiber haben Sie verwendet? fileoder cookie?
KeitelDOG

4

Einige Informationen werden im Cookie gespeichert, das sich auf frühere Versionen von Laravel in der Entwicklung bezieht. Es widerspricht also den von csrf generierten Token, die von den Versionen eines anderen generiert werden. Löschen Sie einfach den Cookie und probieren Sie es aus.


Konnten Sie eine <input type="hidden" name="_token" value="Umr1AlG3sScdUWGtMoHcQPPKASsR7qsd5ZE1H3Xv">Art Code in generiertem HTML sehen?
Suresh Velusamy

Es ist dort. Fand das Problem. Der Sitzungstreiber wurde auf Array gesetzt. Es wurde in eine Datei geändert und der Fehler ist jetzt behoben.
Sougata Bose

4

Für diejenigen, die noch Probleme haben und nichts geholfen hat. Achten Sie auf den Parameter php.ini mbstring.func_overload. Es muss auf 0 gesetzt werden. Und mbstring.internal_encoding muss auf UTF-8 gesetzt sein. In meinem Fall war das ein Problem.


Vielen Dank! Ihre Antwort rettete mein Gehirn vor dem Absturz)
Rustembek Kaliyev

3

Ich ändere die Berechtigung zum Speichern und Fehler war weg. Es schien, dass mangelnde Erlaubnis das Problem war.

sudo chmod -R 775 storage/

2
Seien Sie vorsichtig, wenn Sie solche offenen Berechtigungen rekursiv verwenden. Ich würde gegen 775 für Dateien sehr empfehlen. 755 für Verzeichnisse und 644 für Dateien ist die Norm.
Devon

3

hinzufügen @csrf Sie das Formular aus und gehen auch auf VerifyCsrfToken.php

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

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

1

In meinem Fall war die Site auf dem Server in Ordnung, aber nicht auf dem lokalen. Dann erinnere ich mich, dass ich an einer sicheren Website gearbeitet habe.
Setzen Sie also in der Datei config.session.php die Variable Secure auf false

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

0

Ich hatte die App mit mehreren Subdomains und Session Cookie war das Problem zwischen diesen. Das Löschen der Cookies hat mein Problem behoben.

Versuchen Sie auch, die SESSION_DOMAINin .env- Datei festzulegen . Verwenden Sie die genaue Subdomain, die Sie durchsuchen.


0

Stellen Sie sicher, dass auf Ihrem Webserver die richtige Systemzeit vorhanden ist. In meinem Fall war die Vagabundmaschine in der Zukunft (26. Januar, 14:08:26 UTC 2226), daher war die Zeit im Sitzungscookie meines Browsers natürlich vor mehr als 200 Jahren abgelaufen.



0

Ich habe zwei Lösungen gefunden, um diesen Fehler zu vermeiden. 2) Kommentieren Sie einfach \ App \ Http \ Middleware \ VerifyCsrfToken :: class in der geschützten Middleware-Gruppe im Kernel


0

Ich hatte das gleiche Problem, aber das Problem liegt nicht im Framework, sondern im Browser. Ich weiß nicht warum, aber Google Chrome blockiert Cookies in meinem Fall automatisch. Nach erlaubten Cookies wurde das Problem behoben.


0

Kurze Antwort

Fügen Sie den Routeneintrag für registerin hinzuapp/Http/Middleware/VerifyCsrfToken.php

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

und löschen Sie den Cache und die Cache-Route mit den Befehlen:

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

Einzelheiten

Jedes Mal, wenn Sie auf eine Laravel-Site zugreifen, wird ein Token generiert, auch wenn die Sitzung nicht gestartet wurde. Bei jeder Anforderung wird dieses Token (das in den Cookies gespeichert ist) anhand seiner Ablaufzeit überprüft, die im SESSION_LIFETIMEFeld in der config/session.phpDatei festgelegt ist.

Wenn Sie die Site länger als die Ablaufzeit geöffnet halten und versuchen, eine Anforderung zu stellen, wird dieses Token ausgewertet und der Ablauffehler wird zurückgegeben. Um diese Überprüfung für Formulare zu überspringen, die außerhalb der Funktionen authentifizierter Benutzer liegen (z. B. Registrieren oder Anmelden), können Sie die Ausnahme-Route hinzufügen app/Http/Middleware/VerifyCsrfToken.php.


1
Wenn diese Seite Benutzereingaben verarbeitet, sollte sie CSRF- Prüfungen durchlaufen.
Sougata Bose

@ SougataBose In der Tat, in diesem Fall denke ich, ist es am besten, einen Captcha-Validator als Google reCAPTCHA
JC Gras

0

Oft passiert es, weil Sie das Projekt in einem früheren Datum testen


0

Lösung:

Verwenden Sie den neuen Inkognito-Tab und testen Sie ihn erneut.

Grund:

In meinem Fall hat sich ein anderer Benutzer mit meinem Admin-Panel angemeldet

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.