2013-09-03 27 views
5

Próbuję uzyskać wartość nagłówka z:laravel 4: dlaczego Request :: header() nie otrzymuje określonego nagłówka?

Request::header('csrf_token')

chociaż moja Firebug mówi w nagłówkach, że mam csrf_token ustawiony baMDpF0yrfRerkdihFack1Sa9cchUk8qBzm0hK0C. W rzeczywistości, mogę dostać tego csrf_token zamiast z natywnego kodu php:

getallheaders()['csrf_token']

Teraz pytanie jest robię moje prawo XSRF-ochronny? czy może jest to wada w tym kodzie php robiłam, że naprawdę trzeba używać Buggy laravel 4 funkcja

Request::header('csrf_token')

która zwraca nic, ale puste. I po prostu coś przeoczyłem. może w moich konfiguracjach Laravel 4 itp.?

P.S: Używam AngularJS, ale może to nie ma znaczenia, którego klienta używam. Mam ten link jako moim przewodnikiem: How to send csrf_token() inside AngularJS form using Laravel API?

+0

Pozwolę sobie na małe pytanie: dlaczego oczekujesz, że 'Request :: header ('csrf_token')' zwróci wartość nagłówka w pierwszej kolejności? Tylko z powodu nazwy metody klasy? Czy sprawdziłeś źródło tej metody, co ona faktycznie robi? – hakre

+0

@hakre: dzięki za ten komentarz i pomysł. Kod źródłowy, który mówisz? hmm Nie jest mi łatwo i intuicyjnie podążać. Więc jaka musi być odpowiednia funkcja do użycia? jeśli nie Request :: header(); podobnie jak typ zawartości został pobrany w dokumentacji laravel four; Request :: header ("Content-Type"); – TyrHunter

+0

Chciałem tylko dowiedzieć się, dlaczego wybrałeś ten kod. Jak pokazuje Twój komentarz, wydaje się, że brakuje pewnej minimalnej wiedzy, która jest nietypowym kryterium dla tej witryny z pytaniami i odpowiedziami, ponieważ nawet nie spodziewasz się, że dany kod zadziała i powtarza problem. Proponuję zamiast tego zapytać na forach Laravel 4. – hakre

Odpowiedz

1

Request::header() rzeczywiście stosowanego do retrieval of headers, ale sprawdź gdzie znacznik jest ustawiany .. token CSRF powinny być placed into the session by Laravel, a następnie można uzyskać poprzez metody Session::token() .

Jeśli spojrzysz na HTML wygenerowany przez wywołania do klasy Form::, zobaczysz ukryty element o nazwie _token, który powinien następnie zostać porównany z tokenem w sesji. Możesz uzyskać do niego dostęp za pomocą Input::get('_token'), tak jak w przypadku każdej innej przychodzącej zmiennej GET lub POST.

... Jednak to wszystko nie powinno być naprawdę konieczne, ponieważ może być łatwo zarządzane przez wstępnie zdefiniowane CSRF filtra w filters.php, tylko add that filter to the desired route or route group a będziesz chroniony, bez konieczności dostać się do szczegółów tego.

+0

Witam. Nie mogę używać klasy Form :: laravel, ponieważ moje formularze są generowane przez Angularjs jako moją nakładkę. Ale to nie problem. W moim SPA udało mi się zdobyć token za pomocą '' Więc użyłem tej wartości w moim interfejsie, aby utworzyć nagłówek csrf_token, który będzie następnie odczytywany i dopasowywany do Session :: token() (co ma się dobrze) przez laravel4, choć mogę to uzyskać przez getallheaders() ['csrf_token']; Właśnie zastanawiałem się, dlaczego Request :: header ("csrf_token") zwraca puste – TyrHunter

+0

ah, przepraszam, tę część przegapiłem! Myślę, że Hakre miał rację, najlepiej wziąć udział w forach laravel! :) – msturdy

2

Myślę, że problem jest taki, że w poniższej odpowiedzi na How to send csrf_token() inside AngularJS form using Laravel, której użyłeś, csrf_token nie jest wysyłany w nagłówku twojego XMLHttpRequest, ale w formie własnej.

Należy następnie odfiltrować go w backendu laravel jako zwykłe pole wejściowe. Poniżej znajduje się przykład pracy:

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

UPDATE

Jeśli chcesz użyć nagłówków w kątowe, to raczej coś takiego napisać:

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

W celu aplly nowa nagłówek do twoich XMLHttpRequests.To jest łatwo połów nawet z surowego php takich jak:

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

I rozwiązać problem poprzez usunięcie podkreślenia „_” w csrf_token więc byłoby crsftoken zamiast.

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

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

najwyraźniej Laravel ma problem z nazwami nagłówków z podkreśleniami? – astroanu

+0

to również rozwiązało mój problem. Nigdy bym nie przypuszczał, że to jest problem. –

+0

To również rozwiązało mój problem! Wielkie dzięki. –

1

Problem

laravel jest usuwanie nagłówków z podkreślenia w nazwie podczas pobierania ich z metodą Request::header(). Ponadto wszystkie nazwy nagłówków są przekształcane na małe litery w metodzie Request::header().

Krótki Rozwiązanie

Na frontend, należy wymienić wszystkie podkreślenia w nazwach nagłówków z myślnikami. csrf_token staje csrf-token

Długi Rozwiązanie

Dodaj token laravel CSRF jako kątowym stała na głównej stronie/układu.

Dodaj token jako domyślny nagłówek dla wszystkich żądań w Angular.

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

Czy Twój filtr w laravel csrf sprawdzić na mecz w nagłówkach zamiast wejścia.

/** 
* 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.", 
      ), 
     )); 
    } 
}