【问题标题】:.htaccess - Make a directory invisible.htaccess - 使目录不可见
【发布时间】:2011-10-10 18:39:21
【问题描述】:

我有一个 .htaccess 文件,目前看起来像:

命令允许,拒绝 否认一切 文件> 选项所有索引 索引忽略 * # 使用 404 而不是 403 响应 /include/ 重写引擎开启 重定向匹配 404 ^/include(/?|/.*)$

我试图阻止所有人知道 /include/ 的存在,但是我遇到了一个问题。

虽然访问http://www.example.com/include 会给出404,但浏览器会添加一个斜杠(因此给出http://www.example.com/include/),这表明该目录确实存在,但被伪装了。当访问实际的 404 时,不附加斜线。

有没有办法防止这种行为?

【问题讨论】:

  • 如果目录受到保护,有什么区别?为什么还要麻烦使用 404 而不是 403?这就是 403 的用途。
  • 我正在考虑未来的安全性。这有点矫枉过正,但安全总比后悔好。
  • @Michael Irigoyen 抱歉,但即使是“默默无闻的安全”也总比没有好。攻击者应该尽可能少地了解系统。如果他知道有一些隐藏目录,他可能会将这些微泄漏与 LFI / 代码泄漏 / 等其他漏洞链接起来。仍然可以使用 LFI 暴力破解这些隐藏目录,但攻击者需要知道directory name + @987654324 @。如果没有此类泄漏,攻击者将需要更多时间来利用该系统。顺便说一句,不知道为什么 403 甚至在那里,但恕我直言,它绝对没用。尽可能隐藏和保护一切。

标签: apache .htaccess mod-rewrite http-status-code-404 http-status-code-403


【解决方案1】:

1.您可以使用DirectorySlash Off 告诉Apache 不要在目录末尾添加斜杠。

2. 如果您实际上不使用重写引擎(根据您提供的代码),为什么要使用RewriteEngine OnRedirectMatchmod_rewrite无关。

3. 如果您想在此处使用 mod_rewrite,请尝试此规则 - 它将为 /include 文件夹返回 404 代码(带有和不带有斜杠)以及该文件中的任何资源(例如/include/main.php 等)。

RewriteEngine On

RewriteRule ^include(/|/.+)?$ - [R=404,L]

【讨论】:

  • 我启用了 mod_rewrite,因为我正要添加一些 URL 重写 :) 理想情况下(不在这个问题的范围内),我希望将所有 403 目录转发到 404,但你的建议有解决了我目前的问题。谢谢! :)
  • @Simon 如果您想将所有 403 转发到 404 - 尝试 ErrorDocument 403 /403.php 并在其中 403.php(或您拥有的任何服务器端脚本语言)只需发送正确的 404 标头(它将覆盖403 代码)。
  • @LazyOne 被否决,因为它只防止基本的文件夹搜索。可以绕过您的规则,仍然使用“include/.php”和“include/.htaccess”等请求检测该文件夹(您将收到 403 错误而不是预期的 404)。对不存在文件夹“includeXXX/.php”和“includeXXX/.htaccess”的请求将导致 404。因此您可以尝试使用 ${dirname}/.php 或 ${dirname}/.htaccess
【解决方案2】:

通过点文件泄露目录存在

在某些情况下,以下代码行不足以隐藏您的目录:

RewriteEngine On
RewriteRule ^include(/|/.+)?$ - [R=404,L]

这些行不会阻止include/.phpinclude/.htinclude/.htaccess 之类的请求(相反,您会收到一个403 Forbidden 错误,表明目录include 存在)。相反,人们想禁止访问所有 dot-files 以防止泄露文件夹的存在(.git.php(只是“.php” - 没有文件名)、.htaccess、. ..)。 (旁注:我猜 .htaccess 文件和主要 Apache 配置文件之间可能存在一些问题,您可以在其中禁止访问“.ht”文件并允许执行“.php”文件 - 那就是为什么这样的请求在做自己的事情而没有被简单地重写为 404 错误。而是返回 403 错误)。

因此您可以通过发送以下请求绕过上述规则(您将收到403 Forbidden 错误):

如果目录不存在,您可以验证您将收到404 Not Found 错误:


可能的修复

您需要匹配所有点文件。因此,首先您不允许访问它们(403 错误),然后您只需将 403 错误重写为 404 错误。

Options -Indexes
RewriteEngine On
RewriteRule ^secret.*$ - [R=404,L]

RewriteRule ^404_error$ - [R=404,L]

<FilesMatch "^\\.">
    order allow,deny

    # 403 error
    deny from all

    # Rewrite 403 error to 404 error
    # Error document must be:
    # - "a string with error text" OR
    # - an absolute path which starts with "/" OR
    # - URL (you'll get a redirect)
    ErrorDocument 403 /404_error
</FilesMatch>

这些请求现在被阻止,您将收到 404 Not Found 错误:

  • /secret/treasure.php(该文件夹中的所有文件和目录)
  • /秘密
  • /秘密/
  • /secret?42
  • /secret/?23
  • /secret/.php
  • /secret/.htaccess

这是我类似问题的答案:Rewrite requests to directory with htaccess to 404 error

【讨论】:

  • 这种方法的问题是它需要ErrorDocument,您必须在其中硬编码文档根错误的路径 - 在这种情况下:/404_error。如果您的项目位于 /myproject/ 等额外目录中,则必须更改 .htaccess 文件中的错误文档路径
【解决方案3】:

在 RedirectMatch 之外使用重写规则。

【讨论】:

  • 为什么还要加?只是取而代之
  • 你是对的。重写会阻止任何重定向操作,即使它存在。
  • @WatermarkStudios 我用RedirectMatch 测试过,什么也没发生。 RedirectMatch 的解决方案无效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-05
相关资源
最近更新 更多