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

这是情景:

  • 根文件夹中有一个index.php文件
  • 一些文件包含在index.php文件夹中。
  • 1个其他文件( submit.php )位于表单提交操作的根文件夹中。

我想通过htaccess限制直接用户访问includes文件夹中的文件。 也为submit.php 。 但包括将为index.php文件工作。 就像,如果用户键入www.domain.com/includes/somepage.php ,它会限制它(可能会redirect到一个错误页面)。

我只是将includes文件夹移出web-root,但是如果你想阻止对整个includes文件夹的直接访问,你可以把一个.htaccess文件放在那个只包含以下内容的文件夹中:

 deny from all 

这样,你不能打开该文件夹中的任何文件,但你可以包括他们在没有任何问题的PHP。

这是纯粹的基于mod_rewrite的解决scheme:

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

如果URI包含/includes//submit.php则会显示禁止的错误

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

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

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

在包含文件夹中放入一个“DENY FROM ALL”指令的.htaccess就可以做到这一点。

你的Q分两部分,jeroen和anubhava的解决scheme都适用于第一部分 – 拒绝访问/包含。 anubhava也适用于第二部分。 我更喜欢后者,因为无论如何我都使用了DOCROOT/.htaccess ,并且将所有这样的控制保存在一个文件中。

不过我想讨论的是“拒绝submit.php ”的概念。 如果你不想使用submit.php,那么为什么它在DOCROOT呢? 我怀疑这里的答案是,你以某种forms将它用作行动目标,只希望在表单被提交时被解雇,而不是直接,例如从垃圾邮件。

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

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

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

这可以防止垃圾邮件发送,因为垃圾邮件发送者可以得到一个有效的时间戳/validation对的唯一可行的方法是parsing一个表格,但是这个刮擦只有15分钟的时间。

1个基于mod_alias的解决scheme:

 RedirectMatch 403 ^/folder/file.php$ 

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

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

 Satisfy all Order deny,allow Deny from all 

我碰到这个时,上层目录定义了基本authentication,包括行:

 Satisfy any 

这阻止了我的否认,因为用户被authentication了。