2016-03-30 4 views
0

Ich benutze PHP Slim-Framework für ein persönliches Projekt. Aus irgendeinem Grund filtert die PSR-Implementierung von Request in Slim anscheinend einige Header. Ich versuche, ein benutzerdefiniertes CSRF-Token festzulegen, und es ist nicht über $ request-> getHeaders() verfügbar. Hier ist ein Beispiel, das das Problem zeigt:Kann nicht alle Anfrage Header mit PHP Slim Framework

$app->get('/bar', function ($request, $response, $args) { 
    echo "PHP's getallheaders() <br>"; 
    foreach (getallheaders() as $name => $value) { 
     echo "$name: $value <br>"; 
    } 
    echo "Slim's GetHeaders() <br>"; 
    foreach ($request->getHeaders() as $name => $values) { 
     foreach ($values as $value) { 
      echo "$name: $value <br>"; 
     } 
    } 
}); 

ich diese Ausgabe erhalten:

PHP's getallheaders() 
Host: localhost 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: null 
Accept-Encoding: gzip, deflate 
csrf_name: csrf56fc038c2f6eb 
csrf_value: 4e077c04dadf22377da2aebc1a8caa78 
Cookie: PHPSESSID=41016nbag70gi6shq4u2tg0aq1 
Connection: keep-alive 

Slim's GetHeaders() 
Host: localhost 
HTTP_USER_AGENT: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0 
HTTP_ACCEPT: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
HTTP_ACCEPT_LANGUAGE: null 
HTTP_ACCEPT_ENCODING: gzip, deflate 
HTTP_COOKIE: PHPSESSID=41016nbag70gi6shq4u2tg0aq1 
HTTP_CONNECTION: keep-alive 

Ich versuche, warum die benutzerdefinierten Header zu verstehen:

csrf_name: csrf56fc038c2f6eb 
csrf_value: 4e077c04dadf22377da2aebc1a8caa78 

von Slim entfernt werden.

Antwort

2

Es ist nicht Slim, es ist der Webserver.

Obwohl Header, dessen Name Unterstriche enthält, nach HTTP-Spezifikation gültig sind, löschen sowohl Nginx als auch Apache diese Header aus Sicherheitsgründen. Im Allgemeinen sollten Sie nur Header verwenden, die a..zA..Z und - Zeichen enthalten.

Mit Apache können Sie weiterhin auf den Header mit Unterstrich in ihrem Namen zugreifen, indem Sie getallheaders() verwenden, das ein Alias ​​für apache_request_headers() ist.

Mit Nginx können Sie Header mit Unterstrich in ihrem Namen mit underscores_in_headers on Einstellung aktivieren.

+0

Danke! Gut, diese Details über HTTP-Server zu kennen. Ich fand durch Versuch und Irrtum, so war meine erste Reaktion zu denken, dass es Slim der Schuldige war. –

0

Ob Sie es glauben oder nicht, das Problem war, dass Slim keinen Unterstrich in einem benutzerdefinierten Header mag. Sobald ich csrf_name geändert csrfname es funktionierte:

PHP's getallheaders() 
Host: localhost 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: null 
Accept-Encoding: gzip, deflate 
csrfvalue: 4e077c04dadf22377da2aebc1a8caa78 
csrfname: csrf56fc038c2f6eb 
Cookie: PHPSESSID=5aom8b5q7ottorc9279q9sh4g1 
Connection: keep-alive 

Slim's GetHeaders() 
Host: localhost 
HTTP_USER_AGENT: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0 
HTTP_ACCEPT: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
HTTP_ACCEPT_LANGUAGE: null 
HTTP_ACCEPT_ENCODING: gzip, deflate 
HTTP_CSRFVALUE: 4e077c04dadf22377da2aebc1a8caa78 
HTTP_CSRFNAME: csrf56fc038c2f6eb 
HTTP_COOKIE: PHPSESSID=5aom8b5q7ottorc9279q9sh4g1 
HTTP_CONNECTION: keep-alive 

Also, nicht vergessen, Unterstrichen entfernen !!

EDIT Wie von Mika Tuupola erklärt, ist die Ursache der HTTP-Server und nicht schlank.

Verwandte Themen