【问题标题】:deny direct access to a folder and file by htaccess拒绝通过 htaccess 直接访问文件夹和文件
【发布时间】:2012-03-06 03:07:20
【问题描述】:

这是场景:

  • 根文件夹中有一个index.php 文件
  • 一些文件包含在index.php 中,这些文件位于includes 文件夹中。
  • 另外 1 个文件 (submit.php) 位于用于表单提交操作的根文件夹中。

我想通过 htaccess 限制用户直接访问 includes 文件夹中的文件。也适用于submit.php。但包含将适用于index.php 文件。 比如,如果用户输入www.domain.com/includes/somepage.php,它会限制它(可能会重定向到错误页面)。

【问题讨论】:

    标签: php regex apache .htaccess mod-rewrite


    【解决方案1】:

    我只是将includes 文件夹移出网络根目录,但如果您想阻止对整个includes 文件夹的直接访问,您可以在该文件夹中放置一个.htaccess 文件,其中仅包含:

    deny from all
    

    这样你就无法打开该文件夹中的任何文件,但你可以毫无问题地将它们包含在 php 中。

    【讨论】:

    • 其他文件是否能够对该文件夹中的文件进行 ajax 请求?
    • @ChaitanyaChandurkar 不,ajax 请求是一个正常的 http 请求,因此会被拒绝。
    • Sr b/c 我新的网络编程。如何添加访问我的文件 index.php 的例外?
    • 我使用了拒绝所有人,它限制了每个 url..甚至不显示登录页面.. :(
    • @Aamir 没错,该文件夹中的 url 无法访问,但您可以将它们包含在其他文件中而不会出现任何问题。
    【解决方案2】:

    如果我理解正确,您只是想拒绝访问包含文件夹?

    在包含文件夹中放置一个带有 'DENY FROM ALL' 指令的 .htaccess 就可以解决问题。

    【讨论】:

      【解决方案3】:

      这是纯基于mod_rewrite 的解决方案:

      RewriteRule ^(includes/|submit\.php) - [F,L,NC]
      

      如果 URI 包含 /includes//submit.php,这将显示禁止使用的错误

      【讨论】:

      • 处理提交文件的工作做得很好
      【解决方案4】:

      您的 Q 分为两部分,jeroen 和 anubhava 的解决方案都适用于第一部分 - 拒绝访问 /includes。 anubhava 的作品也适用于第二部分。我更喜欢后者,因为无论如何我都使用DOCROOT/.htaccess,这将所有此类控制保存在一个文件中。

      但是我想讨论的是“拒绝访问submit.php”的概念。如果您不想使用submit.php,那么为什么要在 DOCROOT 中使用它呢?我怀疑这里的答案是您将它用作某些表单中的操作目标,并且只希望在提交表单而不是直接提交时触发它,例如来自垃圾邮件机器人。

      如果这是真的,那么你不能使用 anubhava 的第二部分,因为这会导致你的表单失败。 您可以在这里做的是 (i) 使用 .htaccess 检查以确保引荐来源网址是您自己的索引页面:

      RewriteCond %{HTTP_REFERRER} !=HTTP://www.domain.com/index.php   [NC]
      RewriteRule ^submit\.php$    -                                   [F]
      

      并且 (ii) 在您的 PHP index.php 表单生成器中包含一些用于时间戳和验证的隐藏字段。例如,验证可以是时间戳的 MD5 的前 10 个字符和一些内部机密。在处理提交时,您可以 (i) 验证时间戳和验证是否匹配,以及 (ii) 时间戳在当前时间的 15 分钟内。

      这可以防止垃圾邮件发送,因为垃圾邮件发送者可以获得有效时间戳/验证对的唯一实用方法是解析表单,但这种抓取只有 15 分钟的生命。

      【讨论】:

        【解决方案5】:

        根据可能在更高级别设置的其他选项,您可能需要将以下内容放入包含目录中的 .htaccess 文件中:

        Satisfy all
        Order deny,allow
        Deny from all
        

        我在上层目录定义基本身份验证时遇到了这个问题,包括:

        Satisfy any
        

        这阻止了我的拒绝生效,因为用户已经过身份验证。

        【讨论】:

          【解决方案6】:

          可以使用 Files 指令并禁止访问所有文件,然后再次使用它来设置可访问的文件:

          <Files ~ "^.*">
            Deny from all
          </Files>
          
          <Files ~ "^index\.php|css|js|.*\.png|.*\.jpg|.*\.gif">
            Allow from all
          </Files>
          

          【讨论】:

          • 我不确定发布问题的人是否解决了他的问题,但这是 SO 的美妙之处,多个答案可以帮助很多成员。最后一个答案解决了我的问题。我想让网站获取 css 文件但无法访问 ttf 或 otf 字体,然后繁荣!已解决。
          • 在此之后我不能访问子文件夹中的文件
          【解决方案7】:

          1 班轮基于 mod_alias 的解决方案:

          RedirectMatch 403 ^/folder/file.php$
          

          这将显示 /folder/file.php 的禁止错误

          【讨论】:

          • +1 - 这实际上非常好,因为如果您使用正则表达式 ^folder404 应用于整个文件夹,甚至没有人可以看到存在哪些文件。跨度>
          【解决方案8】:

          您可以将以下命令添加到.htaccess 文件中

          Deny from all
          ErrorDocument 403 "nothing is here"
          

          如果未授权访问,它将显示“这里没有”消息。

          如果您想通过错误代码重定向到某个页面,那么您可以定义如下命令:

          ErrorDocument 404 "/errors/404.html"
          

          它将重定向到/errors/404.html 并显示自定义页面未找到屏幕。

          【讨论】:

            猜你喜欢
            • 2014-08-28
            • 2022-06-28
            • 2011-05-11
            • 2014-12-31
            • 2014-05-11
            • 2015-07-10
            • 2014-06-03
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多