问题 在php 5.5.1 / apache 2.4.6中忽略带有下划线的标题名称


在升级到php 5.5.1和apache 2.4.6之后,检查某些标题现在已被破坏(具体来说,检查 HTTP_X_REQUESTED_WITH)。

通过进一步的测试,我注意到任何包含下划线的自定义标头都会被忽略(我的意思是它不会出现在PHP中 $_SERVER 数组)。所以如果我添加一个名为的标题 my-header,它变得可用 $_SERVER['HTTP_MY_HEADER'],但如果我尝试添加标题 my_header,它不可用 $_SERVER


6328
2017-08-12 11:03


起源

由于您使用的是Apache,因此在使用时会获得正确的标题 apache_request_headers - naththedeveloper
@FDL是的,我确实用apache_request_headers获得了正确的标题 - Pavle Predic
应该在发布之前完成研究...这是apache 2.4中的一个文档化特性:“标题到环境变量的转换比以前更严格,通过标题注入缓解一些可能的跨站点脚本攻击。包含无效字符的标题(现在,我们默默地放弃了下划线。“ - httpd.apache.org/docs/trunk/new_features_2_4.html - Pavle Predic
很好的发现,你应该把它作为答案添加并接受它,以便其他人可以在将来从中获益。 - naththedeveloper


答案:


这是apache 2.4中记录的功能。看到 httpd.apache.org/docs/trunk/new_features_2_4.html

标题到环境变量的翻译比标准变量更严格   之前通过缓解一些可能的跨站点脚本攻击   标题注入。包含无效字符的标头(包括   下划线)现在默默地放弃了。


16
2017-08-13 09:13



你如何解决这个“功能”? - Liam W
只需替换_ by - :“custom_api_key” - >“custom-api-key” - Flo-Schield-Bobby
如果(像我一样)你遇到了无法修改的旧接口,文档解释了一个解决方法: httpd.apache.org/docs/trunk/env.html#fixheader - MattMatt
帕夫勒我很疯狂地寻找我没有工作的原因,你救了我的生命,谢谢。 - Zilev av