关于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

相当于将原来不支持的参数赋值给一个支持的参数,然后继续传递

以上内容,如有错误,欢迎指出。

转载于:https://www.cnblogs.com/it-green-hand/p/9462633.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值