【问题标题】:Block direct access to a file over http but allow php script access阻止通过 http 直接访问文件但允许 php 脚本访问
【发布时间】:2022-11-28 22:34:07
【问题描述】:

我正在将我的文件(pdf、doc、flv 等)加载到缓冲区中,并使用脚本将它们提供给我的用户。我需要我的脚本能够访问该文件但不允许直接访问它。实现这一目标的最佳方法是什么?我应该用我的权限做某事还是用 .htaccess 锁定目录?

【问题讨论】:

标签: php apache permissions


【解决方案1】:

最安全的方法是将您想要保留的文件放在 Web 根目录之外,就像 Damien 所建议的那样。这是可行的,因为 Web 服务器遵循本地文件系统权限,而不是它自己的权限。

但是,有很多托管公司只允许您访问网络根目录。要仍然阻止对文件的 HTTP 请求,请将它们单独放入一个目录中,并使用一个阻止所有通信的 .htaccess 文件。例如,

Order deny,allow
Deny from all

您的网络服务器,以及您的服务器端语言,仍然能够读取它们,因为目录的本地权限允许网络服务器读取和执行文件。

【讨论】:

  • 我在音频文件夹中使用了这个,但它阻止了我的音频播放器播放音频。我正在使用声音管理器 2 播放音频。是否有任何解决方法只允许声音管理器播放该音频文件但停止任何其他直接访问?
  • @sonill - 您可以将某些 IP 列入白名单,以便能够访问这些目录。例如,添加带有Allow from 127.0.0.1 的新行将允许您的服务器(包括任何服务器端代码)访问该目录中的文件。有关这些位的更多文档,请访问httpd.apache.org/docs/2.4/mod/mod_access_compat.html#allow
  • “但是,有很多托管公司只允许您访问网络根目录。”为什么那些公司不能把 web root 比 FTP root 低一级呢?他们对 PHP 的工作原理知之甚少(或者更确切地说,这是一种更有可能的疏忽),还是他们只关心自己的安全和金钱?哦,好吧,只需选择一家真正关心您网站安全的公司。
  • 我试过了,但下载后无法打开文件:打开流失败:HTTP 请求失败! HTTP/1.1 403 禁止访问
  • 当我们尝试从 php 脚本访问时不起作用。你有任何代码如何访问该文件
【解决方案2】:

这就是我阻止从 URL 直接访问我的 ini 文件的方式。将以下代码粘贴到根目录下的.htaccess 文件中。 (无需创建额外的文件夹)

<Files ~ ".ini$">
  Order allow,deny
  Deny from all
</Files>

我的settings.ini 文件在根目录下,没有这个代码就可以访问 www.mydomain.com/settings.ini

【讨论】:

    【解决方案3】:

    在 httpd.conf 中阻止浏览器和 wget 访问包含文件,尤其是 db.inc 或 config.inc 。请注意,您不能在指令中链接文件类型,而是创建多个文件指令。

    <Files ~ ".inc$">
    Order allow,deny
    Deny from all
    </Files>
    

    在重新启动 apache 之前测试您的配置

    service httpd configtest
    

    然后(优雅重启)

    service httpd graceful
    

    【讨论】:

      【解决方案4】:

      这些文件是否与 PHP 脚本位于同一台服务器上?如果是这样,只需将文件保存在 Web 根目录之外,并确保您的 PHP 脚本对它们存储的位置具有读取权限。

      【讨论】:

        【解决方案5】:

        如果您有权访问您的 httpd.conf 文件(在 ubuntu 中它位于 /etc/apache2 目录中),您应该添加与特定目录中的 .htaccess 文件相同的行。即(例如):

        ServerName YOURSERVERNAMEHERE
        <Directory /var/www/>
        AllowOverride None
        order deny,allow
        Options -Indexes FollowSymLinks
        </Directory>
        

        对您想要控制信息的每个目录执行此操作,您将在一个位置拥有一个文件来管理所有访问。在上面的例子中,我是为根目录 /var/www 做的。

        此选项可能不适用于外包托管,尤其是共享托管。但它比添加许多 .htaccess 文件更好。

        【讨论】:

          【解决方案6】:

          为了防止 .ini 文件通过网络访问,将以下内容放入 apache2.conf

          <Files ~ ".ini$">
          Order allow,deny
          Deny from all
          </Files>
          

          【讨论】:

            【解决方案7】:

            基于自定义模块的 .htaccess 脚本(就像它在 CodeIgniter 中使用的那样)怎么样?我试过了,它在 CodeIgniter 应用程序中运行良好。在其他应用程序上使用它有什么想法吗?

            <IfModule authz_core_module>
                Require all denied
            </IfModule>
            <IfModule !authz_core_module>
                Deny from all
            </IfModule>
            

            【讨论】:

              猜你喜欢
              • 2011-02-10
              • 2016-10-24
              • 1970-01-01
              • 2017-03-04
              • 2023-03-18
              • 1970-01-01
              • 2014-04-02
              • 1970-01-01
              • 2014-01-22
              相关资源
              最近更新 更多