2016-03-30 27 views
0

私は個人的なプロジェクトにPHPスリムフレームワークを使用しています。なんらかの理由で、SlimでのRequestのPSR実装は明らかにいくつかのヘッダーをフィルタリングしています。カスタムCSRFトークンを設定しようとしていますが、$ request-> getHeaders()で使用できません。ここでは、問題を示して一つの例です:PHPスリムフレームワークを使用してすべてのリクエストヘッダーを取得できません

$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>"; 
     } 
    } 
}); 

私はこの出力を得る:

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 

私はなぜカスタムヘッダーを理解しようとしています:

csrf_name: csrf56fc038c2f6eb 
csrf_value: 4e077c04dadf22377da2aebc1a8caa78 

はスリムによって除去されています。

答えて

2

スリムではなく、ウェブサーバーです。

名前にアンダースコアが含まれているヘッダーがHTTP仕様で有効であっても、セキュリティ上の理由からNginxApacheはこれらのヘッダーを静かにドロップします。一般的には、a..zA..Z-の文字のみを使用するようにしてください。

Apacheでは、getallheaders()という別名であるapache_request_headers()を使用して、名前にアンダースコアのヘッダーにアクセスできます。

Nginxを使用すると、名前にアンダースコアのヘッダーを有効にして、underscores_in_headers onの設定を行うことができます。

+0

ありがとうございます! HTTPサーバーに関する詳細を知っておくとよいでしょう。私は試行錯誤して見つけたので、私の最初の反応はスリムだと思うことでした。 –

0

信じられないかもしれませんが、Slimはユーザー定義ヘッダーのアンダースコアが気に入らないという問題がありました。一度csrf_nameをcsrfnameに変更すると、それは機能しました:

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 

したがって、アンダースコアを削除することを忘れないでください!!

EDIT Mika Tuupolaが説明したように、根本的な原因はHTTPサーバーであり、スリムではありません。