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

Imr*_*l.H 126 php regex apache .htaccess mod-rewrite

这是场景:

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

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

jer*_*oen 258

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

deny from all
Run Code Online (Sandbox Code Playgroud)

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

  • @ChaitanyaChandurkar不,ajax请求是正常的http请求,因此将被拒绝. (15认同)
  • 其他文件是否能够对该文件夹中的文件发出ajax请求? (6认同)

anu*_*ava 53

这是纯粹mod_rewrite的解决方案:

RewriteRule ^(includes/|submit\.php) - [F,L,NC]
Run Code Online (Sandbox Code Playgroud)

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

  • 很好地解决了提交文件 (3认同)

luk*_*985 25

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

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

<Files ~ "^index\.php|css|js|.*\.png|.*\.jpg|.*\.gif">
  Allow from all
</Files>
Run Code Online (Sandbox Code Playgroud)

  • 我不确定是谁发布了问题是否解决了他的问题,但这是SO的美妙,多个答案可以帮助很多成员.最后一个答案解决了我的问题.我想让网站获得css文件,但无法访问ttf或otf字体,并繁荣!解决. (6认同)

sta*_*een 13

1个基于mod_alias的衬里解决方案:

RedirectMatch 403 ^/folder/file.php$
Run Code Online (Sandbox Code Playgroud)

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


mai*_*een 9

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

带有'DENY FROM ALL'指令的.htaccess放在includes文件夹中就可以了.


Ter*_*ryE 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]
Run Code Online (Sandbox Code Playgroud)

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

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


Kei*_*ith 6

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

Satisfy all
Order deny,allow
Deny from all
Run Code Online (Sandbox Code Playgroud)

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

Satisfy any
Run Code Online (Sandbox Code Playgroud)

由于用户已通过身份验证,这可以防止我拒绝全部生效.