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

问题描述 投票:0回答:8

场景如下:

  • 根文件夹中有一个
    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
8个回答
282
投票

贝尔纳多

Have you had quiet guard?

弗朗西斯科

Not a mouse stirring.

贝尔纳多

Well, good night.
If you do meet Horatio and Marcellus,
The rivals of my watch, bid them make haste.

弗朗西斯科

I think I hear them. Stand, ho! Who's there?

Enter HORATIO and MARCELLUS

霍雷肖

Friends to this ground.

马塞勒斯

And liegemen to the Dane.

弗朗西斯科

Give you good night.

65
投票

这是纯粹基于

mod_rewrite
的解决方案:

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

如果 URI 包含

/includes/
/submit.php

,这将显示禁止使用的错误

34
投票

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

<Files ~ "^.*">
  Deny from all
</Files>

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

16
投票

1 基于 liner mod_alias 的解决方案:

RedirectMatch 403 ^/folder/file.php$

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


10
投票

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

在包含文件夹中放置带有“DENY FROM ALL”指令的 .htaccess 即可解决问题。


8
投票

您的 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 分钟的寿命。


8
投票

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

Satisfy all
Order deny,allow
Deny from all

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

Satisfy any

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


3
投票

您可以将以下命令添加到

.htaccess
文件

Deny from all
ErrorDocument 403 "nothing is here"

如果未经授权的访问,它将显示“这里没有任何内容”消息。

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

ErrorDocument 404 "/errors/404.html"

它将重定向到

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

© www.soinside.com 2019 - 2024. All rights reserved.