關於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

相當於將原來不支持的參數賦值給一個支持的參數,然后繼續傳遞

以上內容,如有錯誤,歡迎指出。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM