无法使用PHP slim框架检索所有请求头
我正在为一个个人项目使用PHP slim框架。出于某种原因,Slim中请求的PSR实现显然是在过滤一些头。我正在尝试设置自定义CSRF令牌,但它无法通过$request->getHeaders()使用。下面的一个示例说明了问题:无法使用PHP slim框架检索所有请求头,php,rest,http,slim,slim-3,Php,Rest,Http,Slim,Slim 3,我正在为一个个人项目使用PHP slim框架。出于某种原因,Slim中请求的PSR实现显然是在过滤一些头。我正在尝试设置自定义CSRF令牌,但它无法通过$request->getHeaders()使用。下面的一个示例说明了问题: $app->get('/bar', function ($request, $response, $args) { echo "PHP's getallheaders() <br>"; foreach (getallheaders()
$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>";
}
}
});
我试图理解为什么自定义标题:
csrf_name: csrf56fc038c2f6eb
csrf_value: 4e077c04dadf22377da2aebc1a8caa78
正在被Slim删除。信不信由你,问题是Slim不喜欢在用户定义的标题中使用下划线。一旦我将csrf_名称更改为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
所以,别忘了,去掉下划线
编辑正如Mika Tuupola所解释的,根本原因是HTTP服务器而不是slim 信不信由你,问题在于Slim不喜欢在用户定义的标题中使用下划线。一旦我将csrf_名称更改为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
所以,别忘了,去掉下划线
编辑正如Mika Tuupola所解释的,根本原因是HTTP服务器而不是slim 它不是纤细的,它是Web服务器 即使名称包含下划线的头在HTTP规范中是有效的,出于安全原因,也会自动删除这些头。通常,您应该只使用包含
a..zA..Z
和-
字符的标题
使用Apache,您仍然可以使用getallheaders()
访问名称中带有下划线的标题,这是Apache\u request\u headers()
的别名
使用Nginx,您可以使用
设置启用名称中带有下划线的标题。它不是细长的,而是Web服务器
即使名称包含下划线的头在HTTP规范中是有效的,出于安全原因,也会自动删除这些头。通常,您应该只使用包含a..zA..Z
和-
字符的标题
使用Apache,您仍然可以使用getallheaders()
访问名称中带有下划线的标题,这是Apache\u request\u headers()
的别名
使用Nginx,您可以启用标题名中带有下划线的标题,并在标题设置中添加下划线。
谢谢!很高兴了解有关HTTP服务器的详细信息。我通过反复试验发现了这一点,所以我的第一反应是认为是斯利姆作案。谢谢!很高兴了解有关HTTP服务器的详细信息。我通过反复试验发现了这一点,所以我的第一反应是认为凶手是斯利姆。