【问题标题】:Cannot retrieve all request headers using PHP slim framework无法使用 PHP slim 框架检索所有请求标头
【发布时间】:2016-03-30 18:07:51
【问题描述】:

我正在为个人项目使用 PHP slim 框架。出于某种原因,Slim 中 Request 的 PSR 实现显然正在过滤一些标头。我正在尝试设置自定义 CSRF 令牌,但无法通过 $request->getHeaders() 获得。这是一个显示问题的示例:

$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 

正在被 Slim 移除。

【问题讨论】:

    标签: php rest http slim slim-3


    【解决方案1】:

    它不是 Slim,它是网络服务器。

    尽管名称包含下划线的标头在 HTTP 规范中是有效的,但出于安全原因,NginxApache 都会默默地删除这些标头。一般来说,您应该只使用包含a..zA..Z- 字符的标题。

    使用 Apache,您仍然可以使用 getallheaders()apache_request_headers() 的别名)访问名称中带有下划线的标头。

    使用 Nginx,您可以使用 underscores_in_headers on 设置启用名称中带有下划线的标头。

    【讨论】:

    • 谢谢!很高兴了解有关 HTTP 服务器的这些详细信息。我是通过反复试验找到的,所以我的第一反应是认为罪魁祸首是 Slim。
    【解决方案2】:

    信不信由你,问题在于 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
    

    所以,别忘了,去掉下划线!!

    编辑 正如 Mika Tuupola 所解释的,根本原因是 HTTP 服务器,而不是苗条。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-04
      • 1970-01-01
      • 2013-06-12
      • 2015-08-19
      • 1970-01-01
      • 1970-01-01
      • 2015-10-24
      相关资源
      最近更新 更多