Hi Warum ist mein Csrf-Tokenwert null? Und wenn ich kein Token verwende, habe ich TokenMismatchException nicht benutzt !!!! wie kann ich es reparieren ?
Ich habe tiefer gegraben und festgestellt, dass eine Sitzung nicht in SessionServiceProvider registriert wird. Gibt es etwas, das aktiviert werden muss, damit dies standardmäßig funktioniert? Da ich a Laravel Anfänger bin, bin ich mir nicht sicher, wie ich den Ratschlag oben befolgen soll. Wie stelle ich sicher, dass meine Routen unter der Gruppe "Web" hinzugefügt werden?
<form method="post" action="<?php echo url('/form'); ?>">
<input type="hidden" name="_Token" value="{{ csrf_token() }}">
<input type="text" name="Title" placeholder="Title"><br>
<textarea rows="10" name="Content" placeholder="Content"></textarea><br>
<input type="submit" value="Send">
</form>
Stellen Sie sicher, dass auf Ihrer Route die web milddleware angewendet ist.
So ziemlich jeder Weg, auf dem Sie Sitzungen, csrf-Schutz, verschlüsselte Cookies, Sitzungsfehler usw. wünschen, müssen Sie die 'Web'-Middleware-Gruppe anwenden.
Überprüfen Sie Ihre route.php-Datei wie folgt auf die Routengruppe:
Route::group(['middleware' => 'web'], function () {
//
});
Update: Seit 5.2.27 Die RouteServiceProvider
setzt jetzt alle Ihre Routen in routes.php
in eine Routengruppe, in der die web
-Middleware installiert ist.
In Version 5.2: Sie verschieben Route in:
Route::group(['middleware' => ['web']], function () {
//Your route here
});
Sie haben zwei Möglichkeiten, Token in Form zu verwenden ( https://laravel.com/docs/master/routing#csrf-protection ):
// Vanilla PHP
<?php echo csrf_field(); ?>
// Blade Template Syntax
{{ csrf_field() }}
Oder
<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>">
Stellen Sie sicher, dass der session-Pfad beschreibbar ist. Ist dies nicht der Fall, vergleicht laravel den Wert null (kein Sitzungstoken) mit dem Wert $ _POST ['_ token'] und wirft trotz des eigentlichen Grunds einen Konflikt aus.
benutzen
{!! csrf_token() !!}
anstatt
{{ csrf_token() }}
Nur wenn noch jemand dieses Problem trifft,
inside config/session.php meine Sitzungen funktionierten im Wesentlichen nicht (obwohl sie für eine Weile in Ordnung zu sein schienen)
Stellen Sie sicher, dass die Variable ' domain ' auf null gesetzt ist!
Behebung alles für mich als keine der anderen Dinge, wo eigentlich mein Problem.
Hoffe es hilft jemandem.
Bearbeiten Sie dazu Ihre VerifyCsrfToken.php aus dem Middleware-Ordner
<?php namespace App\Http\Middleware;
use Closure;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
class VerifyCsrfToken extends BaseVerifier {
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$response = $next($request);
$response->headers->set('Access-Control-Allow-Origin' , '*');
$response->headers->set('Access-Control-Allow-Methods', 'POST, GET, OPTIONS, PUT, DELETE');
$response->headers->set('Access-Control-Allow-Headers', 'Content-Type, Accept, Authorization, X-Requested-With, Application');
return $response;
}
}
Ich habe das gleiche Problem wie Sie, ich bin auf Laravel 5.2, ich habe auch ein Token-Feld in meinem Formular, aber trotzdem wirft mir der Fehler von "TokenMismatch" sehr nervig, oder?
Ich denke, dass dies ein sehr tiefes Problem ist, da es viele Ursachen dafür geben kann .. Für mich habe ich ein Upgrade von Laravel 5.1 auf 5.2 durchgeführt. Ich verwende die Datenbank auch zum Speichern meiner Sitzungen ... Diese gab mir diesen Fehler, aber als ich die Laravel-Fehlerprotokolle (/ storage/logs) überprüfte, stellte ich fest, dass Laravel 5.2 in der Sitzungstabelle user_id erwartet , ip_address und user_agent Felder. Meins nicht Wenn ich diese Felder hinzufügte, funktionierte alles genauso wie vor dem Upgrade . Mein Rat ist also, das Fehlerprotokoll zu überprüfen!
Diese Antwort gilt für alle Personen, die {{ csrf_field() }}
.__ bereits verwendet haben. Sie haben nach dem <form>
-Tag in ihrer view.blade.php
-Datei den php artisan key:generate
-Befehl ausgeführt, erhalten jedoch weiterhin den Token Mismatch-Fehler. Dies sind die Schritte, die ich unternommen habe, um den TokenMismatchException-Fehler für eines meiner Projekte zu beheben, das sich noch in der Entwicklung befand.
Löschen Sie Cache-Dateien aus den folgenden zwei Ordnern in Ihrem Laravel-Projekt:
Löschen Sie Ihren Browser-Cache, nachdem Sie die Cache-Dateien entfernt haben.
Ich habe das gleiche Problem. Ich habe nicht gefunden, wie ein Kernproblem behoben werden kann, aber ich denke, dass dies eine anständige Lösung ist: Laravel 5.x: CSRF-Fehler auf vorherige Seite umleiten
Stattdessen TokenMismatchException
redirect
Benutzer auf vorherige Seite mit Fehlermeldung zu werfen.
Dazu override
VerifyCsrfToken.($request, Closure $next)
Methode.
Öffnen Sie App\Http\Middleware\VerifyCsrfToken.php
und gehen Sie zur Basisklasse (Illuminate\Foundation\Http\Middleware\VerifyCsrfToken
) und kopieren Sie die Handle-Methode in App\Http\Middleware\VerifyCsrfToken.php
und ändern Sie die Zeile, die TokenMismatchException
auslöst, um zur vorherigen Seite umzuleiten. Fügen Sie auch Import use Closure;
hinzu. Nach allen Änderungen wird App\Http\Middleware\VerifyCsrfToken.php
folgendermaßen aussehen:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
/**
* Class VerifyCsrfToken
* @package App\Http\Middleware
*/
class VerifyCsrfToken extends BaseVerifier
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
//
];
public function handle($request, Closure $next)
{
if (
$this->isReading($request) ||
$this->runningUnitTests() ||
$this->shouldPassThrough($request) ||
$this->tokensMatch($request)
) {
return $this->addCookieToResponse($request, $next($request));
}
//throw new TokenMismatchException;
return Redirect::back()->withError('Sorry, we could not verify your request. Please try again.');
}
}
Lösung 2 ist die Verwendung von Koffein für Laravel .
Caffeine For Laravel ist ein Paket, mit dem verhindert werden soll, dass CSRF-Token von Benutzern auf Ihrer Website ein Zeitlimit überschreiten, während Sie ein Formular ausfüllen.
Mike, der Paketersteller, wollte eine sichere Möglichkeit haben, Benutzern, die sich Zeit nehmen, Formulare auszufüllen, das Leben leichter zu machen, indem sie das Token durch einen hinter den Kulissen befindlichen Ajax-Aufruf wach halten.
Sie könnten dies einfach verwenden:
<form method="POST" action="/addUser" >
{!! csrf_field() !!}
...
</form>
Um die Sicherheit in diesem Formular nicht zu überprüfen, muss der Dateipfad: config/auth.php auf Laravel aufgerufen werden. In dieser Datei sollten Sie die Zeile 'no_csrf' => array(),
finden (oder erstellen). In dieser Zeile werden die Routen hinzugefügt, deren Sicherheit nicht überprüft werden kann. In dieser Anordnung müssen Sie den Pfad zu Ihrem Formular hinzufügen, beispielsweise:
'No_csrf' => array('/form'),
Vielleicht können Sie dies verwenden: (src = https://laravel.com/docs/5.2/routing )
<form action="/foo/bar" method="POST">
<input type="hidden" name="_method" value="PUT">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>
Ich hatte das gleiche Problem. Gelöst wurde es durch Löschen aller Dateien im Sitzungsordner ..__ Der Pfad des Sitzungsordners lautet: yourApplication/storage/framework/sessions /
Ich kann dieses Problem bestätigen, sowohl csrf_token () als auch csrf_field () erzeugen leere Tokenfelder in Laravel 5.2. Laut den Dokumenten sollten beide Methoden noch funktionieren, scheinen dies aber nicht zu tun. Meine Installation ist völlig neu, so dass entweder die Dokumente falsch sind oder ein Fehler vorliegt.