关于2.4版本以后apache/httpd开始不支持下划线header的解决方法
Posted it-green-hand
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于2.4版本以后apache/httpd开始不支持下划线header的解决方法相关的知识,希望对你有一定的参考价值。
官方文档给出的解释:http://httpd.apache.org/docs/current/env.html#fixheader
(以下摘自官方文档,英文不想看的可以直接看忽略。。直接从下划线后内容开始)
——————————————————————————————
Passing broken headers to CGI scripts
Starting with version 2.4, Apache is more strict about how HTTP headers are converted to environment variables in mod_cgi
and other modules: Previously any invalid characters in header names were simply translated to underscores. This allowed for some potential cross-site-scripting attacks via header injection (see Unusual Web Bugs, slide 19/20).
If you have to support a client which sends broken headers and which can‘t be fixed, a simple workaround involving mod_setenvif
and mod_headers
allows you to still accept these headers#
# The following works around a client sending a broken Accept_Encoding # header. SetEnvIfNoCase ^Accept.Encoding$ ^(.*)$ fix_accept_encoding=$1 RequestHeader set Accept-Encoding %{fix_accept_encoding}e env=fix_accept_encoding
————————————————————————————————————————————————————————————————————————————
1、原因:防止通过请求头注入进行跨站攻击,
如果非要支持有两种解决方法
a、降级httpd
b、修改配置文件(本文内容)
2、如何解决修改?
直接进入正题,根据官网的提示,需要修改httpd的配置文件(以httpd2.4.6 centos7为例)
楼主直接修改的虚拟主机配置文件,个人认为,只修改单个虚拟主机文件不影响其他虚拟主机。。感兴趣的可以自己测试修改/etc/httpd/conf/httpd.conf文件。这样应该是支持全局了。
楼主自己的虚拟主机配置文件在/etc/httpd/conf.d文件夹下
在配置文件下面位置添加
<VirtualHost *:80>
(添加位置)
</VirtualHost>
添加内容:
官方文档原文:
SetEnvIfNoCase ^Accept.Encoding$ ^(.*)$ fix_accept_encoding=$1 RequestHeader set Accept-Encoding %{fix_accept_encoding}e env=fix_accept_encoding
直接将以上内容添加到配置文件中是没有用的。。楼主试过了
需要修改五处内容(原文带颜色的部分)
1)红色部分Accept.Encoding改为你要传入到请求头中带有下划线的内容,并将原来的下划线替换为.(点)
例如:要将x-my_id传入到请求头中,那么将红色部分改为x-my.id
2)修改绿色内容Accept-Encoding,将你的参数中带有下划线的部分改为-(dansh)
例如,要将x-my_id传入,那么将绿色部分改为x-my-id
3)修改三处紫色内容,这三处为变量名称,名称随意,要保持一致
以x-my_id为例,最终修改结果为:(xxxxx为省略内容,不是实际需要添加的内容)
<VirtualHost *:yourport>
xxxxx
SetEnvIfNoCase ^x-my.id$ ^(.*)$ aa=$1
RequestHeader set x-my-id %{aa}e env=aa
xxxxx
</VirtualHost>
注意:
如果要添加多个带有下划线请求头参数支持,可以添加多个SetEnvIfNoCase和RequestHeader,但是变量(紫色内容)需要修改成不同的值。
PS:
解释一下:
SetEnvIfNoCase ^x-my.id$ ^(.*)$ aa=$1
意思是如果x-my.id中有.那么将其值赋给aa
RequestHeader set x-my-id %{aa}e env=aa
意思是将aa的值赋给请求头参数x-my-id
相当于将原来不支持的参数赋值给一个支持的参数,然后继续传递
以上内容,如有错误,欢迎指出。
以上是关于关于2.4版本以后apache/httpd开始不支持下划线header的解决方法的主要内容,如果未能解决你的问题,请参考以下文章