通过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了。