Ich habe Laravel 5.7 installiert
Der Datei wurde ein Formular hinzugefügt \resources\views\welcome.blade.php
<form method="POST" action="/foo" >
@csrf
<input type="text" name="name"/><br/>
<input type="submit" value="Add"/>
</form>
Zur Datei hinzugefügt \routes\web.php
Route::post('/foo', function () {
echo 1;
return;
});
Nach dem Senden einer POST-Anfrage:
419 Entschuldigung, Ihre Sitzung ist abgelaufen. Bitte aktualisieren und erneut versuchen.
In der Version 5.6
gab es kein solches Problem.
return;
können Sie anrufenreturn redirect()->back();
. Soweit ich sehen kann, hat die App nach der Post-Anfrage nichts mehr zu tun. Möglicherweise können Sie es nach der Verarbeitung der Anforderung in eine Ansicht umleiten.file
fürSESSION_DRIVER
in.env
es funktioniert gut. Warum funktioniert die datenbankbasierte Sitzung nicht?vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php
67 debuggen, um zu erfahren, warumsessions
Tisch für einen anderen Zweck benutzt hatte. Nachdem Sie diesen Tabellennamen in einen geeigneteren geändert und dieartisan session:table
Migration ausgeführt und aktualisiert haben, funktioniert alles einwandfreiAntworten:
Bevor Sie unten lesen, stellen Sie sicher, dass Sie
@csrf
oder{{ csrf_field() }}
in Ihrer Form mögen<form method="post"> @csrf <!-- {{ csrf_field() }} --> ... rest of form ... </form>
Die Fehlermeldung "Sitzung abgelaufen" oder "Seite abgelaufen" in larvel wird angezeigt, weil irgendwo die Überprüfung Ihres CSRF-Tokens fehlschlägt, was bedeutet, dass die
App\Http\Middleware\VerifyCsrfToken::class
Middleware bereits aktiviert ist. In der Form ist die@csrf
Blade-Direktive bereits hinzugefügt, was ebenfalls in Ordnung sein sollte.Der andere zu überprüfende Bereich ist die Sitzung. Die
csrf
Token-Überprüfung ist direkt mit Ihrer Sitzung verbunden. Daher möchten Sie möglicherweise überprüfen, ob Ihr Sitzungstreiber funktioniert oder nicht, z. B. wenn ein falsch konfigurierter Redis ein Problem verursacht.Möglicherweise können Sie versuchen, Ihren Sitzungstreiber / Ihre Sitzungssoftware aus Ihrer
.env
Datei zu wechseln. Die unterstützten Treiber sind unten angegebenUnterstützte Session-Treiber in Laravel 5, Laravel 6 und Laravel 7 (Doc Link)
file
- Sitzungen werden in Speicher / Framework / Sitzungen gespeichert.cookie
- Sitzungen werden in sicheren, verschlüsselten Cookies gespeichert.database
- Sitzungen werden in einer relationalen Datenbank gespeichert.memcached
/redis
- Sitzungen werden in einem dieser schnellen, Cache-basierten Speicher gespeichert.array
- Sitzungen werden in einem PHP-Array gespeichert und nicht beibehalten.Wenn Ihr Formular nach dem Wechseln des Sitzungstreibers funktioniert, stimmt etwas mit diesem bestimmten Treiber nicht. Versuchen Sie, den Fehler von dort aus zu beheben.
Mögliche fehleranfällige Szenarien
Wahrscheinlich funktionieren dateibasierte Sitzungen aufgrund von Berechtigungsproblemen mit dem
/storage
Verzeichnis möglicherweise nicht (ein schnelles Googeln bringt Ihnen die Lösung). Denken Sie auch daran, dass 777 für das Verzeichnis niemals die Lösung ist.Im Fall des Datenbanktreibers ist Ihre DB-Verbindung möglicherweise falsch oder die
sessions
Tabelle ist möglicherweise nicht vorhanden oder falsch konfiguriert (der falsche Konfigurationsteil wurde gemäß dem Kommentar von @Junaid Qadir als Problem bestätigt).redis/memcached
Die Konfiguration ist falsch oder wird gleichzeitig von einem anderen Code im System manipuliert.Es ist möglicherweise eine gute Idee,
php artisan key:generate
einen neuen App-Schlüssel auszuführen und zu generieren, der wiederum die Sitzungsdaten löscht.Clear Browser Cache HARD , ich fand, dass Chrome und Firefox mehr als ich mich erinnern kann ein Schuldiger sind.
Lesen Sie mehr darüber, warum Anwendungsschlüssel wichtig sind
quelle
_token
vom FORMULAR empfangenen Wert zu vergleichen . Vermeiden Sie die VerwendungSESSION_DOMAIN=...
mit IP, die von Chrome- und HTTP-Cookie-Spezifikationen als unsicher eingestuft wird.419 Page Expired
angezeigt. Wie können Sie einem einfachen Benutzer aus Gründen der Benutzerfreundlichkeit mitteilen, was gerade passiert ist und wie Sie es lösen können?Dies liegt daran, dass für das Formular eine CSRF erforderlich ist. In Version 5.7 haben sie es in @csrf geändert
<form action="" method="post"> @csrf ...
Referene: https://laravel.com/docs/5.7/csrf
quelle
csrf
Feld, ich habe gerade in die Bearbeitungshistorie geschautdann
fügen Sie
SESSION_DOMAIN=
in Ihrer .env Dateioder in deiner config / session.php
'domain' => env('SESSION_DOMAIN', ''),
und dann laufen
php artisan cache:clear
fügen Sie
SESSION_DOMAIN=mydomain.com
in Ihrer .env Dateioder in deiner config / session.php
'domain' => env('SESSION_DOMAIN', 'mydomain.com'),
und dann laufen
php artisan cache:clear
quelle
Wie wäre es mit
{{ csrf_field() }}
anstatt@csrf
419 Fehler ist hauptsächlich auf Probleme mit dem CSRF-Token zurückzuführen.
quelle
{{ csrf_field() }}
?Ich benutze Laravel 5.7. Ich hatte das gleiche Problem und es lag daran, dass das CSRF-Token nicht in der Form war, also fügte ich hinzu
Das Problem wurde behoben
quelle
Probieren Sie Kommentar
\App\Http\Middleware\EncryptCookies::class
in\app\Http\Kernel.php
mir ähnliches Problem und löste es , indem dies zu tun. Wahrscheinlich nicht die beste Lösung, weil die Sicherheit aber zumindest funktioniert hat.Zuvor habe ich versucht:
\App\Http\Middleware\VerifyCsrfToken::class
in\app\Http\Kernel.php
\Illuminate\Session\Middleware\AuthenticateSession::class
in\app\Http\Kernel.php
Aber keines davon hat bei mir funktioniert.
BEARBEITEN
Mein Fall hier ist, dass jedes Mal, wenn ich mich anmelde, eine neue Sitzungsdatei erstellt wird (die alte bleibt bestehen, wird aber plötzlich vergessen. Überprüfen
storage/framework/sessions
) und ein neues CSRF-Token generiert wird. Das Problem liegt also nicht bei VerifyCsrfToken.Wie @Vladd im Kommentarbereich erwähnt, sollten Sie niemals einen Kommentar abgeben
\App\Http\Middleware\VerifyCsrfToken::class
. Sie müssen überprüfen, ob Sie den richtigen CSRF-Token an den Server gesendet haben.quelle
ändere dein
@csrf
in welcome.blade.php in<input type="hidden" name="_token" value="{{ csrf_token() }}">
Ihr Code sieht also so aus:
<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>
quelle
Es könnte ein Problem mit Ihrer Sitzung sein. Nachdem ich mit diesen Einstellungen herumgespielt hatte, löste ich mein Problem. Für mich war es die letzte Option.
Quelle: Laravel Session ändert immer jede Aktualisierung / Anforderung in Laravel 5.4
quelle
SESSION_SECURE_COOKIE
Schalter (geändert infalse
) es für mich getan. (amlocalhost:8000
)Wenn Sie ein CSRF-Token hinzufügen, wird Ihr Problem behoben. {{csrf_token}} oder @csrf
quelle
Um diesen Fehler zu beheben, müssen Sie zuerst einen der folgenden Befehle in das Formular-Tag einfügen.
@csrf
ODER{{ csrf_field }}
Wenn Ihr Problem nicht behoben ist, gehen Sie wie folgt vor: (Beachten Sie, dass sich einer der oben genannten Befehle im Formular-Tag befinden muss.)
1. Fügen Sie einen der folgenden Befehle in das Formular-Tag
@csrf
ODER ein{{ csrf_field }}
2.Öffnen Sie die ENV-Datei und ändern Sie die Werte in "Datei" im Abschnitt SESSION_DRIVER.
3. Dann sollten Sie den Laravel-Cache zurücksetzen. Geben Sie die folgenden Befehle in das Terminal ein
php artisan view:clear
php artisan route:clear
php artisan cache:clear
php artisan config:cache
4. Trennen Sie im letzten Schritt das Projekt vom Serve und klicken Sie erneut auf PHP Artisan Serve
Ich hoffe, Ihr Problem ist gelöst
quelle
Nach so viel Zeit habe ich es auf diese Weise gelöst
Mein Laravel-Installationspfad war nicht der gleiche wie in der Konfigurationsdatei session.php
'domain' => env('SESSION_DOMAIN', 'example.com'),
quelle
Es mag übertrieben sein, aber Sie können dies versuchen:
// Formularaufruf für benannte Route mit hinzugefügtem ausgeblendeten Tokenfeld.
<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>
// Benannte Route
Route::post('/foo', function () { return 'bar'; })->name('foo');
// Füge dies innerhalb des
<head></head>
Blocks hinzu:<meta name="_token" content="{!! csrf_token() !!}" />
Ich habe es auf meinem lokalen mit Homestead auf Laravel 5.7 getestet, was eine Neuinstallation mit Laravel Installer 2.0.1 war, und es hat funktioniert. Was ist deine Umgebung?
Theorie: Ich frage mich, ob das etwas mit dem Blade-Rendering von HTML-Tags im
{{ }}
Vergleich{!! !!}
zu Ihrer Umgebung zu tun hat oder wie Sie es bereitstellen (z. B.php artisan serve
). Was lässt mich denken , dass istline 335
der/vendor/laravel/framework/src/illuminate/Foundation/helpers.php
sollte die gleiche Linie manuell getippt oben machen.quelle
<meta>
Tags sollten innerhalb der<head>
, nicht innerhalb der platziert werden<body>
. Ich bin mir nicht sicher, ob dies dem HTML-Validator gefallen würde.Es gibt kein Problem im Code. Ich habe mit demselben Code geprüft, den Sie bei der Neuinstallation geschrieben haben.
Formularcode:
<form method="POST" action="/foo" > @csrf <input type="text" name="name"/><br/> <input type="submit" value="Add"/> </form>
web.php
Dateicode:Route::get('/', function () { return view('welcome'); }); Route::post('/foo', function () { echo 1; return; });
Das Ergebnis nach dem Absenden des Formulars ist:
Wenn Sie Ihren Browser-Cache leeren oder es mit einem anderen Browser versuchen, wird dies meiner Meinung nach behoben.
quelle
Ein schneller, schlechter Ansatz ist, dass Sie zu app \ http \ middleware \ verifycsrftoken.php gehen und die Route in die Liste $ Except hinzufügen. Die Post-Anfrage wird für die CSRF-Token-Überprüfung ignoriert.
protected $except = [ // 'doLogin.aspx', 'create_coupon', ];
quelle
419 | Seite Dieser Fehler bedeutet ein großes Sicherheitsproblem. Dies bedeutet, dass das Feld csrf-Token nicht richtig verwendet wird.
verwenden
{{csrf_field}}
und Ihr Problem wird gelöst.quelle
Es sollte funktionieren, wenn Sie alle folgenden Schritte ausführen:
Stellen Sie sicher, dass Ihre Sitzung gut konfiguriert ist. Der einfachste Weg besteht darin, eine Datei zu erstellen und sicherzustellen, dass der Speicherordner über die Berechtigung chmod 755 verfügt. Wenn
.env
Sie sie wie folgt festlegen, ist der Dateisitzungstreiber der einfachste Weg, sie festzulegen.SESSION_DRIVER=file SESSION_DOMAIN= SESSION_SECURE_COOKIE=false
Stellen Sie sicher, dass der Cache-Ordner gelöscht und beschreibbar ist. Führen Sie dazu den folgenden Befehl aus.
Stellen Sie sicher, dass die Ordnerberechtigungen gut festgelegt sind. Sie sollten wie folgt konfiguriert werden:
sudo chmod -R 755 storage sudo chmod -R 755 vendor sudo chmod -R 644 bootstrap/cache
Stellen Sie sicher, dass in Ihrem Formular ein
@csrf
Token enthalten ist.Hoffe das wird dein Problem lösen.
quelle
In deiner
Http/Kernel.php
versuche diese Zeile zu kommentieren:
\Illuminate\Session\Middleware\AuthenticateSession::class,
in Ihrem Web-Middleware-Array
Es könnte die Wurzel Ihres Problems sein
quelle
Standardmäßig hatte ich dieses Problem nicht. Also habe ich
chmod -R 644 sessions
das Problem repliziert.Danach habe ich dem Sitzungsordner von Berechtigungen erteilt
chmod -R 755 sessions
Jetzt funktioniert mein Projektcode wieder.
Der Grund dafür ist, dass Sie Ihren Cache mit fehlenden Schreibberechtigungen in einer Datei speichern.
Lösungen:
1 - Wie ich oben behoben habe, können Sie dem Sitzungsordner 755 Berechtigungen erteilen. 2 - Sie können eine andere Sitzungstreiberkonfiguration verwenden.
Denken Sie daran; Wenn Sie memcached / redis verwenden möchten, müssen diese auf Ihrem Server installiert sein, oder Ihr Docker-Redis-Container muss ausgeführt werden.
quelle
Eigentlich ist CSRF ein sitzungsbasiertes Token. Fügen Sie Ihre Route zu einer Routengruppe hinzu und fügen Sie eine Middleware hinzu, die die Sitzungen steuert.
Web ist eine Standard-Middleware in Laravel und kann die Sitzungsanforderungen steuern.
Route::group(array('middleware' => ['web']), function () { Route::post('/foo', function () { echo 1; return; }); });
quelle
Wenn Sie bereits über die Anweisung csrf verfügen , haben Sie möglicherweise die Art und Weise geändert, in der Sitzungen ausgeführt werden.
In
config/session.php
, überprüfen Sie die ‚sicheren‘ Bereich. Es sollte auf false stehen, wenn https auf Ihrem Server nicht verfügbar ist.Sie können auch
SESSION_SECURE_COOKIE=FALSE
Ihre.env
Datei (Stammverzeichnis) ablegen.quelle
Öffnen Sie die Befehlszeile cmd in Ihrem Projekt.
1.Befehl
2.comand
quelle
Haben Sie auch die csrf im Header Ihrer Anwendung?
<meta name="csrf-token" content="{{ csrf_token() }}">
quelle
Während das Formular hat
@csrf
, zeigt es immer noch419 pages has expired
Ich habe es nach der Update-
SESSION_SECURE_COOKIE
Option auf false in config / session.php gelöst'secure' => env('SESSION_SECURE_COOKIE', false)
als Cache löschen
quelle
Gehen Sie zu config / session.php
finde die Reihe
'secure' => env('SESSION_SECURE_COOKIE', true),
ändere es in false
'secure' => env('SESSION_SECURE_COOKIE', false),
Wenn dieser Parameter auf TRUE gesetzt ist, müssen Sie im Browser das HTTPS-Protokoll verwenden, andernfalls wird die Sitzung nicht gespeichert. Da es nicht gültig ist
quelle
Ich habe das alles durchgesehen und bin hier, um eine Antwort zu finden. In meinem Fall bestand die Lösung darin, den Browserverlauf zu löschen.
quelle
In meinem Fall war ein?> Am Ende der route.php. Verbrachte viel Zeit dort ...
quelle
?>
am Ende vonweb.php
Ich hatte genau das gleiche Problem und es lag daran, dass ich völlig dumm war. Ich hatte alle Formularfelder (und nicht nur die Schaltfläche "Senden") über Javascript deaktiviert, bevor ich das Formular abschickte! Dies führte natürlich dazu, dass nicht alle Formularelemente (einschließlich der ausgeblendeten) übermittelt wurden
_token
Felds) , was wiederum den 419-Fehler verursachte!Ich hoffe das hilft jemandem von ein paar Stunden Kopfkratzen!
Deaktivierte Formulareingaben werden in der Anforderung nicht angezeigt
quelle
Ich habe dieses Problem vor langer Zeit bekommen. Ich erinnerte mich, dass es die Erlaubnis von verursacht
storage/framework/sessions
. Möglicherweise möchten Sie es perchmod -R 0777 storage/framework/sessions
Befehl ändern . Es hat bei mir funktioniert.quelle
In meinem Fall ist es sehr lächerlich. Ich erhalte den Fehler 419, wenn ich
Auth::routes()
oben in die Routendatei eingefügt habe.Auth::routes(); Route::middleware('auth')->group(function () { Route::get('/', 'DashboardController@index')->name('dashboard'); });
Und ich habe den Fehler behoben, indem ich
Auth::routes();
zum Ende der Routendatei gegangen bin .Route::middleware('auth')->group(function () { Route::get('/', 'DashboardController@index')->name('dashboard'); }); Auth::routes();
Vielleicht kann es auch Ihrem Fall helfen. Viel Glück.
quelle
Bitte beachten Sie, dass Fehler 419 angezeigt wird, wenn Sie versuchen, eine große Datei hochzuladen, die die maximale Größe der Post-Datei überschreitet. In diesem Fall können Sie sowohl upload_max_filesize als auch post_max_size auf einen angemessenen Betrag erhöhen (z. B. 10M oder 20M hängen von Ihrem Anwendungsfall und Ihren Ressourcen ab). Überprüfen Sie dies hier: https://stackoverflow.com/a/2184541/2100489
Dies kann jedoch zu Problemen beim Ressourcenverbrauch führen, z. B. bei Bandbreite und Speicher. Als Lösung können Sie die Dateigröße überprüfen, bevor Sie das Formular senden, und eine Warnmeldung anzeigen.
quelle