【问题标题】:.htaccess - Deny access to folder but allow access to file via index.php.htaccess - 拒绝访问文件夹但允许通过 index.php 访问文件
【发布时间】:2014-12-31 18:40:09
【问题描述】:

我在子文件夹中遇到 .htaccess 和 PHP 文件的问题。我想要实现的是阻止任何人访问我的子文件夹中的任何文件 - 但我希望我的 index.php 能够访问这些文件。

DOCROOT/subfolder -> www.somewebsite.com/subfolder/somefile.php
-> Access Denied

但是

[index.php]
<form action="/subfolder/somefile.php">
...
</form>
-> Success!

我很想通过使用 .htaccess 来解决这个问题。我试过deny from alland 还有一些RewriteRules 但这些规则也会杀死来自 index.php 的任何请求。 我试过了

Order deny,allow
Deny from all
Allow from 127.0.0.1
Allow from somewebsite.com
Satisfy Any

但是来自 index.php 的请求被拒绝了。有人可以帮忙吗?

【问题讨论】:

    标签: php apache .htaccess mod-rewrite


    【解决方案1】:
    RewriteEngine On
    RewriteCond %{HTTP_REFERER} !^http://www.hello.com/index.php
    RewriteRule .*subfolder/somefile\.php - [NC,F]
    

    第二行检查访问者是否不是来自某个 url。第 3 行阻止他们访问 somefile.php

    【讨论】:

    • 不工作。阻止 URL 和通过 index.php 访问。
    【解决方案2】:

    这是人们的误解。仅仅因为您从另一个 PHP 文件链接到 PHP 文件并不意味着 index.php 文件正在访问它们。最终用户/浏览器仍然在访问它们,只是你的index.php 文件告诉它去哪里。与如何访问它完全无关。在您的两种情况下,浏览器都在访问它们。

    您能做的最好的事情就是查看referer 字段。它可以很容易地伪造来解决这个问题,但这是你唯一能做的。

    RewriteEngine On
    RewriteCond %{HTTP_REFERER} !^https?://(example.com|127\.0\.0\.1) [NC]
    RewriteRule ^subfolder/ - [L,F]
    

    其中“example.com”是您的网站。

    【讨论】:

    • 旁注 问:使用RewriteCond %{HTTP_REFERER} 比$_SERVER['HTTP_REFERER'] 更可靠,不能被操纵?根据stackoverflow.com/a/6023980
    • @Fred-ii- PHP 的 $_SERVER['HTTP_REFERER'] 由 apache 填充,并且来自存储 %{HTTP_REFERER} 重写变量的值的同一位置。它们都来自 HTTP 请求标头的 Referer: 字段。他们都是一样的。
    • 这似乎行不通。只需键入 somewebsite.com/subfolder/somefile.php 即可轻松访问我的子文件夹中的文件。
    • 如我上面评论中的链接所述:“使用HTTP_REFERER 不可靠,它的值取决于浏览器或客户端应用程序发送到的HTTP Referer 标头服务器,因此不能被信任。” - 所以我只是想知道这是否是最好的解决方案。然而,想知道是来自.htaccess 还是来自 PHP 脚本是否会有所不同,以及是否一个比另一个更可靠,即在 .htaccess 中。
    • @Fred-ii- 如果您需要知道某人单击了链接的位置,而不使用 cookie 或其他东西跟踪服务器端的所有内容,则没有其他方法。同样,使用重写条件变量或 PHP 变量没有区别因为它们都来自完全相同的地方。
    【解决方案3】:

    在您的 .htaccess 中,您可以将任何请求重定向到该目录中除 index.php 以外的文件,如下所示:

    <directory "DOCROOT/subfolder">
        RewriteCond %{REQUEST_FILENAME} !=/DOCROOT/subfolder/index.php
        RewriteRule ^/(.+)$ redirect.php [L]
    </directory>
    

    【讨论】:

    • &lt;Directory&gt; 容器不允许在 htaccess 文件中,因为 htaccess 文件已经是每个目录的上下文。
    • 获取内部服务器错误 500。不确定我是否正确理解了您的答案 - 您的代码阻止了对同一子文件夹中除 index.php 之外的任何文件的访问,对吧?
    • 对不起,我的错误。您可以将上述内容放入您的虚拟主机配置中,或者您可以取出目录标签并将内容放入 DOCROOT/subfolder 内的 .htaccess 文件中
    猜你喜欢
    • 2022-06-28
    • 1970-01-01
    • 2016-03-23
    • 2016-10-31
    • 2011-05-11
    • 2021-08-13
    • 1970-01-01
    • 2012-03-06
    • 2016-03-06
    相关资源
    最近更新 更多