我的.htaccess中有以下行,以防止直接访问各种文件类型:
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?example.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?example.com$ [NC]
RewriteRule .*\.(jpg|jpeg|png|gif|bmp|css|ini|db|js)$ - [F,NC]
并且它有效,即如果我尝试访问文件http://example.com/test.png,它将生成403 Forbidden Error页面。
BUT,... 我发现如果我用一个斜杠(http://example.com/test.png/)键入地址,它将在浏览器中显示test.png文件。实际上,通过访问http://example.com/test.png/ANYTHING_HERE形式的任何网址,它将在浏览器中显示test.png。
为什么?以及如何预防?
感谢。
答案 0 :(得分:0)
如果在请求结束时有斜杠,那么apache会将其作为PATH INFO的一部分。出于某种原因,您的服务器设置为甚至处理非脚本实体以接受资源之后的路径(可能是因为您的处理程序?)。
通常,对于脚本,如果您有这样的URL:
http://example.com/path/script.php/this/is/path/info
script.php
脚本可以通过查看$_SERVER['PATH_INFO']
变量来访问路径信息,并查看其中的/this/is/path/info
。
由于您的图片不是脚本,因此路径的这一部分会被丢弃并且您的图片会被提供。您需要像这样调整正则表达式:
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?example.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?example.com$ [NC]
RewriteRule .*\.(jpg|jpeg|png|gif|bmp|css|ini|db|js)(?:/.*|)$ - [F,NC]