解決URL中包含“%2F”導致Apache地址重寫mod_rewrite失效的問題


在使用Apache地址重寫mod_rewrite期間,發現,當URL和PATH_INFO中出現%2f(/)或者%5c(\), 會被認為這是個不合法的請求, Apache將會直接返回"404 (Not Found)"錯誤。

也就是說,Apache在調用 mod_proxy 或 mod_rewrite 模塊之前,就直接拒絕請求,給出404錯誤。

這樣做主要是為了防止CGI的安全漏洞發生,尤其是在腳本中使用了PATH_INFO但是又沒有做安全過濾操作的話,很容易被注入漏洞。

假定URL是安全的,即我們想用這種URL中包含這種編碼轉換的字符串,如何操作?如何解決這個問題?

有2種解決方案:

方案一:打開Apache的“AllowEncodedSlashes”指令

在Apache的配置文件(httpd.conf)中,找到 <VirtualHost> 節點,配置如下代碼即可(注意,把此規則添加到.htaccess文件中是不起作用的。)

<VirtualHost *:80>
	AllowEncodedSlashes On
</VirtualHost>

打開此指令,告訴Apache服務器,允許URL地址中包含編碼字符串,如

http://www.example.com/books/the_lamp%2C_linux%2Fapache%2Fmysql%2Fphp_solution.html

這樣,不修改PHP代碼就可解決問題。但是,並不是所有的用戶都允許去修改Apache的配置文件,或者說,不修改Apache的配置文件,如何解決這個問題?

方案二:兩次urlencode()

$url .= urlencode(urlencode($title)) . '.html'

變成

http://www.example.com/books/the_lamp%252C_linux%252Fapache%252Fmysql%252Fphp_solution.html

具體可以參看:http://httpd.apache.org/docs/2.2/mod/core.html#allowencodedslashes


免責聲明!

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



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