Frage Laravel 4: Warum erhält Request :: header () nicht den angegebenen Header?


Ich versuche, einen Header-Wert zu erhalten mit:

Request::header('csrf_token')

Allerdings sagt mein Firebug in den Kopfzeilen, dass ich das csrf_token gesetzt habe baMDpF0yrfRerkdihFack1Sa9cchUk8qBzm0hK0C. Tatsächlich kann ich das bekommen csrf_token stattdessen mit einem nativen PHP-Code:

getallheaders()['csrf_token'] 

Jetzt ist die Frage, ob ich meinen XSRF-Schutz richtig mache? oder vielleicht gibt es einen Fehler in diesem PHP-Code, den ich tat, dass ich wirklich Buggy Laravel 4-Funktion verwenden muss

Request::header('csrf_token')

Das gibt nichts als leer zurück. Und ich habe gerade etwas verpasst. vielleicht in meinen Laravel 4 Konfigurationen, etc?

PS: Ich benutze AngularJS, aber vielleicht spielt es keine Rolle, welche Clientseite ich verwende. Ich habe diesen Link als meinen Leitfaden: Wie sende ich csrf_token () in AngularJS Formular mit Laravel API?


5
2017-09-03 06:13


Ursprung


Antworten:


Ich löste das Problem, indem ich den Unterstrich '_' in csrf_token entfernte, so dass es stattdessen crsftoken wäre.

Request::header('csrf_token'); // Not working

Request::header('csrftoken'); // Working!

5
2017-10-07 16:59



Ich denke das Problem ist das in der folgenden Antwort auf So senden Sie csrf_token () innerhalb von AngularJS mit Laravel das Sie verwendet haben, das csrf_token wird nicht in der Kopfzeile Ihrer XMLHttpRequest aber in der Form selbst gesendet.

Sie müssen es dann in Ihrem Laravel-Backend als reguläres Eingabefeld filtern. Ein Arbeitsbeispiel finden Sie unten:

Route::filter('csrf_json', function()
{
    if (Session::token() != Input::get('csrf_token'))
    {
        throw new Illuminate\Session\TokenMismatchException;
    }
});

AKTUALISIEREN

Wenn Sie Header in Angular verwenden möchten, schreiben Sie lieber etwas wie:

$httpProvider.defaults.headers.common['Authorization'] = TOKEN;

Um einen neuen Header zu Ihren XMLHttpRequests anzulegen. Dann ist es auch mit rohen PHP leicht abrufbar, wie zum Beispiel:

$aHeaders = getallheaders();
if (Session::token() != $aHeaders['authorization']) etc.

2
2018-05-12 05:31



Problem

Laravel entfernt Header mit einem Unterstrich in dem Namen, wenn sie mit dem Request::header() Methode. Darüber hinaus werden alle Headernamen in Kleinbuchstaben konvertiert Request::header() Methode.

Kurze Lösung

Ersetzen Sie im Frontend alle Unterstriche in den Kopfzeilen durch Bindestriche. csrf_token wird csrf-token

Lange Lösung

Fügen Sie das Laravel CSRF-Token als Winkelkonstante auf Ihrer Hauptseite / Ihrem Layout hinzu.

<script>
    angular.module("myApp").constant("CSRF_TOKEN", "<?php echo csrf_token(); ?>"); 
</script>

Fügen Sie das Token als Standard-Header für alle Ihre Anfragen in Angular hinzu.

angular.module("myApp").run(function($http, CSRF_TOKEN){
    $http.defaults.headers.common["csrf-token"] = CSRF_TOKEN;
})

Habe dein csrf Filtern Sie in Laravel nach einer Übereinstimmung in den Headern und nicht nach einer Eingabe.

/**
 * Check that our session token matches the CSRF request header token.
 *
 * @return json
 */
Route::filter("csrf", function() {
    if (Session::token() !== Request::header("csrf-token")) {
        return Response::json(array(
            "error" => array(
                "code"    => "403",
                "message" => "Ah ah ah, you didn't say the magic word.",
            ),
        ));
    }
}

2
2018-01-20 23:14



Request::header() wird tatsächlich für die Abrufen von Kopfzeilen, aber überprüfen Sie, wo das Token gesetzt wird. Das CSRF-Token sollte sein von Laravel in die Sitzung gestelltund dann kann es durch die zugegriffen werden Session::token() Methode.

Wenn Sie sich den HTML-Code anschauen, der durch Aufrufe an den Form:: Klasse, Sie sehen ein verstecktes Element namens _token, die dann mit dem Token in der Sitzung verglichen werden sollte. Sie können darauf zugreifen mit Input::get('_token')wie bei jeder anderen eingehenden GET- oder POST-Variablen.

... Dies sollte jedoch nicht wirklich notwendig sein, da es leicht durch das vordefinierte verwaltet werden kann CSRF einfiltern filters.php, gerade Fügen Sie diesen Filter der gewünschten Route oder Routengruppe hinzu und du wirst geschützt sein, ohne dich in die Einzelheiten zu begeben.


1
2017-09-03 11:23



Das Problem liegt beim Symfony-Request-Objekt, das im Laravel-Framework erweitert wurde. Sehen Sie sich diesen GitHub-Thread an

https://github.com/laravel/framework/issues/1655#issuecomment-20595277

Die Lösung in Ihrem Fall wäre, den Header-Namen auf HTTP_CSRF_TOKEN oder HTTP_X_CSRF_TOKEN zu setzen, wenn Sie Ihren eigenen HTTP-Headern Präfix X vorsetzen möchten.


0
2017-10-30 00:50