我喜欢这种限制访问方法的语法Order deny,allow
,而且我试图避免使用 mod_rewrite:有没有办法让未经授权的 IP 只看到 404 而不是 403(这是 HTTP 代码,表示“这里有绝密内容,请停止查看”?)
谢谢。
答案1
403 页面依赖于 Apache 提供该 html。您可以使用以下指令覆盖任何<Location>
或指令:<Directory>
ErrorDocument
<Directory /web/docs>
ErrorDocument 403 /404-page.html
</Directory>
ETC..http://httpd.apache.org/docs/1.3/mod/core.html#errordocument
答案2
请注意,这看起来像但不是一个解决方案!
当仅提供自定义错误页面(例如,为 403 错误提供虚假的 404)时,您可能会在 Web 浏览器中获得所需的结果,但远程攻击者仍然能够从服务器获取真正的 HTTP 响应,即仍然是 403(禁止),因此,他可以猜测文件系统结构。
在这里你可以看到 curl -v -X GEThttp://desidered.path/forbidden_badly_hidden_folder/
`< HTTP/1.1 403 Forbidden
< Date: Thu, 04 Nov 2010 14:42:52 GMT
< Server: Apache/2.2.8 (CentOS)
< X-Powered-By: PHP/5.2.10
< Content-Length: 202
< Connection: close
< Content-Type: text/html; charset=ISO-8859-1
<
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL was not found on this server.</p>`
好吧,我可以解决这个问题,并使用特定的每个文件夹规则获取所需的输出(404 未找到):
RewriteRule ^/WebSite/forbidden_badly_hidden_folder$ /error/fake_404_403.php
RewriteRule ^/WebSite/forbidden_badly_hidden_folder/$ /error/fake_404_403.php
其中 /error/fake_404_403.php 是故意不存在的页面,那么您将从相同的 curl 测试中获得以下输出:
< HTTP/1.1 404 Not Found
< Date: Thu, 04 Nov 2010 14:43:12 GMT
< Server: Apache/2.2.8 (CentOS)
< X-Powered-By: PHP/5.2.10
< Content-Length: 202
< Connection: close
< Content-Type: text/html; charset=ISO-8859-1
<
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL was not found on this server.</p>`
这是期望的行为;
我的问题是,是否可以编写一条全局规则,对 /var/www/html 和子文件夹上的任何 403(F)资源执行这样的工作,将其重写为不存在的路径,然后返回所需的 404 Not Found?
提前致以最诚挚的感谢
马可