关于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_headersallows 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的解决方法的主要内容,如果未能解决你的问题,请参考以下文章

Apache httpd2.2版本以及2.4版本部分实验

Linux—搭建Apache(httpd)服务

centos 6 编译安装httpd-2.4

编译安装Apache(httpd-2.4.18)

CentOS 7 下源代码安装Apache 2.4

Apache httpd-2.4 相关文件