2016-06-12 15 views
0

Ich benutze Laravel Version 5.2.37. Ich habe ein einfaches HTML-Formular in der Blattansicht mit der folgenden Zeile:Laravel erstellt bei jeder Aktualisierung ein neues CSRF-Token

<input type="hidden" name="_token" id="token" value="{{ csrf_token() }}"> 

Wenn ich den Code des Klienten Shared-Hosting (Cpanel, PHP 5.5.36) laden, ohne das Formular abschicken, ich traf die Aktualisierung und Der csrf-Token-Wert ändert sich ständig.

Allerdings, auf meinem lokalen Rechner (MacOS/Apache2/5.6.16), das csrf-Token für mindestens 2 Minuten (pro Config/Session.php Einstellungen). Könnte es die ältere Version 5.5.36 von PHP sein, die das verursacht?

UPDATE: Ich habe CSRF-Validierung deaktiviert und festgestellt, dass obwohl die Sitzung in einer Datei gespeichert wird, wenn es auf einer anderen Seite aufgerufen wird, es nicht mehr gefunden wird. Ich wollte auch notieren, dass dieser Server PCI-konform ist.

+0

wenn Sie einreichen, funktioniert es? –

+0

Wenn Sie einen Wert in die Sitzung eingeben, dann drücken Sie eine Route, um diesen Wert zu erhalten, oder? nach einem Problem der Sitzungsregenerierung suchen. – lagbox

+0

Wenn ich über Ajax einreiche, erhalte ich TokenMismatchException. Ich habe versucht, die Routen in 'Route :: group (['Middleware' => ['web']], function() {...}' zu verpacken, aber ohne Erfolg. Wieder sollte es das csrf-Token nicht regenerieren, Egal ob es gesendet oder aktualisiert wurde, richtig? – bazzaretta

Antwort

0

Nun, endlich habe ich es herausgefunden. Dumme ich einen benutzerdefinierten Helfer mit einer Funktion, die in etwa so aussah:

<?php 
function doSomething($arg) 
{ 
    ?><p>When this function is called, 
    display <b><?php echo $arg; ?> value.</b></p> 
    <?php 
} 
?> 

Sie haben wahrscheinlich viele Funktionen wie diese in Wordpress geschrieben gesehen. Obwohl es nicht der Handwerkscode ist, wird es in den meisten Fällen gut funktionieren, aber Laravel wird diese Art von Unsinn im Umgang mit Helfern nicht tolerieren. So kam alles wieder normal, nachdem ich meine Funktion schrieb stattdessen die Zeichenfolge zurück:

<?php  
function doSomething($arg) 
{ 
    return '<p>When this function is invoked, 
    display <b>' . $arg . '</b> value.</p>'; 
}  
?> 

Moral der Geschichte - nicht hässlich Code schreiben. Stellen Sie sicher, dass Ihre Funktion zurückkehrt und niemals direkt Strings echos/druckt, insbesondere bei Hilfsfunktionen.

Wenn Sie immer noch Probleme mit nicht persistenten Tokens haben, würde ich vorschlagen, Laravel direkt neben Ihrem Projekt zu installieren, einen einfachen Token-Test durchzuführen und dann den von Ihnen hinzugefügten benutzerdefinierten Code auf mögliche Fehler hin zu überprüfen. Mit 99% Sicherheit sage ich, dass der Fehler von Ihrem eigenen Code verursacht wird.

1

Versuchen Sie, Domain in Config/Session.php auf den richtigen Pfad zu definieren. Standardmäßig ist es auf null gesetzt, aber auf dem Server sollten Sie das deaktivieren.

+0

Ich habe das versucht. Es hat nicht funktioniert. Ich denke, ich muss CSRF deaktivieren Schutz für den URI in der Klasse VerifyCsrfToken Wenn ich jemals eine passende Lösung finde, werde ich sie hier veröffentlichen. – bazzaretta

Verwandte Themen