拒绝通过htaccess直接访问文件夹和文件

时间:2012-02-14 18:21:23

标签: php regex apache .htaccess mod-rewrite

以下是该方案:

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

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

7 个答案:

答案 0 :(得分:256)

我只是将includes文件夹移出web-root,但是如果要阻止对整个includes文件夹的直接访问,可以将.htaccess文件放入该文件夹只包含:

deny from all

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

答案 1 :(得分:51)

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

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

如果URI包含/includes//submit.php

,则会显示禁止使用的错误

答案 2 :(得分:13)

基于mod_alias的1个解决方案:

RedirectMatch 403 ^/folder/file.php$

这将显示/folder/file.php

的禁止错误

答案 3 :(得分:9)

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

带有'DENY FROM ALL'指令的.htaccess放在包含文件夹中就行了。

答案 4 :(得分:8)

你的Q分为两部分,jeroen和anubhava的解决方案都适用于第一部分 - 拒绝访问/包含。 anubhava也适用于第二部分。我更喜欢后者,因为我总是使用DOCROOT/.htaccess,这样就可以将所有这些控制保存在一个文件中。

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

如果这是真的那么你就不能使用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 :(得分:6)

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

Satisfy all
Order deny,allow
Deny from all

当上层目录定义了包括以下行的基本身份验证时,我遇到了这个:

Satisfy any

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

答案 6 :(得分:0)

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

Deny from all
ErrorDocument 403 "nothing is here"

在未经授权的情况下,它将显示“这里什么都没有”消息。

如果要通过错误代码重定向到特定页面,则可以定义如下命令:

ErrorDocument 404 "/errors/404.html"

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