2015-12-26 3 views
7

Hallo Warum ist mein csrf-Token-Wert null? Und wenn ich Token nicht verwende, habe ich nicht TokenMismatchException !!!! wie kann ich es reparieren ? Laravel 5.2: csrf Token funktioniert nicht

Look at the image Please

Ich grub tiefer und fand, dass eine Sitzung in SessionServiceProvider nicht registriert wird. Gibt es etwas, das aktiviert werden muss, damit dies standardmäßig funktioniert? Da ich ein Laravel-Anfänger bin, bin ich mir nicht sicher, wie ich dem obigen Ratschlag folgen 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> 
+1

Das Posten eines Bildes hilft nicht sehr. Ist Ihre Seite eine Blade-Vorlage? z.B. 'Ihre-Seite.Klinge.php'? – Franco

+0

@Franco Ja. Meine Seite habe .blade.php. Ich schreibe das csrf_token(), aber wenn ich inspect Element der Seite. _Token-Eingabewert ist null! –

+1

Das ist seltsam. Ich benutze dies die ganze Zeit ohne Probleme. Versuchen Sie, das Token wiederzugeben, um zu sehen, was passiert? Value = "" ' – Franco

Antwort

22

Vergewissern Sie sich, dass auf Ihrer Route das web milddleware angewendet wird.

So ziemlich jede Route, wo Sie Sitzungen, csrf Schutz, verschlüsselte Cookies, Sitzungsfehler, etc ... benötigen Sie die 'Web' Middleware-Gruppe angewendet werden müssen.

Überprüfen Sie Ihre routes.php Datei für die Route Gruppe wie folgt:

Route::group(['middleware' => 'web'], function() { 
    // 
}); 

Update: Seit 5.2.27 Die RouteServiceProvider setzt nun alle Ihre Routen in routes.php in einer Route Gruppe, die die web Middleware hat für dich angewendet.

0

Vielleicht können Sie diese 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> 
+0

Dosis nicht funktionieren !! Aa ich arbeite in localhost! Ihr csrf_fied oder Token funktionierte in localhost? Localhost muss konfiguriert werden? –

+0

Ich habe meine Antwort bearbeitet, hoffe, dass es Ihnen weiterhilft – Kokno

+0

Danke aber funktioniert nicht –

0

ich dieses Problem bestätigen kann, sowohl csrf_token() und csrf_field() erzeugen leere Token Felder 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.

+2

ist Ihre Route, die das verwendet "Web" -Middleware? – lagbox

+0

Hat den Trick gemacht! :) – Jasper

3

Verwendung

{!! csrf_token() !!} 

statt

{{ csrf_token() }} 
0

Ich habe ein gleiches Problem. Ich habe nicht gefunden, wie ein Kernproblem zu beheben, aber ich denke, dass dies eine anständige Lösung ist: Laravel 5.x: Redirect CSRF Errors to Previous Page
Statt TokenMismatchExceptionredirect Benutzer zur vorherige Seite zu werfen, mit mit Fehlermeldung.
Um es zu tun overrideVerifyCsrfToken.($request, Closure $next) Methode.
Öffnen Sie App\Http\Middleware\VerifyCsrfToken.php und erhalten Sie zur Basisklasse (Illuminate\Foundation\Http\Middleware\VerifyCsrfToken) und kopieren Sie Handle-Methode in App\Http\Middleware\VerifyCsrfToken.php und ändern Sie die Zeile, die TokenMismatchException wirft auf die vorherige Seite umleiten. Fügen Sie auch den Import use Closure; hinzu. So, nachdem alle Änderungen, wird App\Http\Middleware\VerifyCsrfToken.php wie folgt 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 Caffeine For Laravel zu verwenden.
Caffeine For Laravel ist ein Paket, das entwickelt wurde, um zu verhindern, dass CSRF-Token beim Ausfüllen eines Formulars auf Ihrer Website ein Zeitlimit erreichen.
Mike, der Paketersteller, wollte einen sicheren Weg haben, um das Leben einfacher für Benutzer zu machen, die sich die Zeit nehmen, Formulare auszufüllen, indem sie den Token durch einen Ajax-Anruf hinter den Kulissen wach halten.

0

Sie könnten nur verwenden:

<form method="POST" action="/addUser" > 
{!! csrf_field() !!} 
... 
</form> 
4

In Version 5.2: Sie bewegen Weg in:

Route::group(['middleware' => ['web']], function() { 
    //Your route here 
}); 

haben Zweiweg-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(); ?>"> 
1

Ich denke, das ist ein ziemlich tiefes Problem, da es viele Ursachen dafür geben kann. Für mich habe ich von Laravel 5.1 auf 5.2 aktualisiert. Ich verwende auch die Datenbank, um meine Sitzungen zu speichern. Es gab mir diesen Fehler, aber als ich die Laravel-Fehlerprotokolle (/ Speicher/Protokolle) überprüfte, fand ich, dass Laravel 5.2 erwartet, dass die Sitzungstabelle Felder user_id, ip_address und user_agent hat. Meins nicht. Als ich diese Felder hinzufügte, funktionierte alles wie vor dem Upgrade. Also, mein Rat ist, das Fehlerprotokoll zu überprüfen!

-1

Mein Vorschlag ist, FormHelper und Form::open() aus Ihrer Sicht zu verwenden. Fomr- und HTML-Helfer wurden in Version 5.0 aus dem Laravels-Kern entfernt, aber Sie können sie nach den Anweisungen these erneut installieren.

Wie auch immer, es gibt einen Tippfehler in Ihrer Sicht. Der korrekte Feldname lautet _token und nicht . Vielleicht ist das das Problem

0

Um die Sicherheit auf diesem Formular nicht zu überprüfen, müssen Sie den Pfad: config/auth.php auf Laravel gehen. In dieser Datei sollten Sie die Zeile 'no_csrf' => array(), finden (oder sie erstellen). Diese Zeile dient zum Hinzufügen der Routen, deren Sicherheit nicht verifiziert werden kann. Bei dieser Anordnung müssen Sie den Pfad zu Ihrem Formular hinzufügen, wie zum Beispiel:

'No_csrf' => array('/form'), 
3

Stellen Sie sicher, dass Sitzung Pfad beschreibbar ist. Wenn nicht, vergleicht Laravel null (kein Session-Token) mit dem Wert von $ _POST ['_ token] und löst trotz des wahren Grundes einen Mismatch-Fehler aus.

0

Ich hatte das gleiche Problem. Gelöst, indem Sie alle Dateien in den Sitzungsordner löschten. Der Weg der Sitzungen Ordner ist: yourApplication/storage/Rahmen/sessions/

3

Bearbeiten Sie Ihre VerifyCsrfToken.php von Middleware-Ordner auf diese

<?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 das gleiche Problem wie Sie, ich bin auf Laravel 5.2, ich habe auch ein Token Feld auf meinem Formular aber trotzdem wirft mich der Fehler "TokenMismatch" sehr nervig auf?

0

Diese Antwort ist für alle Menschen, die bereits {{ csrf_field() }} nach dem <form> Tag in ihrer view.blade.php Datei und auch führen Sie den Befehl php artisan key:generate sind aber nach wie vor die immer Token Mismatch Fehler verwendet haben. 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 von Cache-Dateien aus den folgenden zwei Ordnern in Ihrem Laravel Projekt:

  1. Speicher/Rahmen/sessions/
  2. Speicher/Rahmen/views/

Nachdem die Cache-Dateien zu entfernen, Löschen Sie Ihren Browser-Cache.

3

Gerade einhüllen noch jemand dieses Problem trifft,

innen config/session.php meine Sitzungen wurden im Wesentlichen nicht funktioniert (auch wenn sie in Ordnung für eine Weile schien)

Vergewissern Sie sich, dass die 'Domäne' Variable ist auf Null gesetzt!

Fixed alles für mich als keine der anderen Dinge, wo eigentlich mein Problem.

Ich hoffe, es hilft jemandem.