【问题标题】:Allow scripts to read a file but prevent users from viewing the file directly允许脚本读取文件但阻止用户直接查看文件
【发布时间】:2011-08-08 05:20:09
【问题描述】:

假设我有一个纯文本文件example.txt,并且我的网络服务器readfile.php 上有一个PHP 脚本。

我想要做的是阻止用户输入http://www.example.com/example.txt 并直接查看文本文件,但我仍然希望人们能够加载从文件example.txt 读取的http://www.example.com/readfile.php 并且确实带有它的东西(可能显示文件的内容)。

另外,如果可以做到这一点,最好的方法是什么?

【问题讨论】:

标签: php linux


【解决方案1】:

是的,这很容易做到。

有两种主要方法可以阻止用户访问example.txt。第一种是将其放在您的网络文件夹之外的文件夹中(通常称为wwwpublic_html),第二种是将.htaccess 文件与您的 example.txt 脚本一起放入该文件夹中,该脚本会阻止对该文件的访问共。 .htaccess 看起来像

<files "example.txt"> 
deny from all 
</files>

但如果您想阻止文件夹中的所有.txt 文件,您可以将example.txt 更改为*.txt

然后你可以在你的readfile.php中使用file_get_contents()来获取文本文件的内容,或者如果你只是想输出文件你可以使用readfile

【讨论】:

  • +1 用于将文件放入 web 目录并使用 .htaccess。谢谢。
  • 我添加了 .htaccess 文件,但是在尝试调用 file_get_contents() :: failed to open stream 时出现错误:HTTP 请求失败! HTTP/1.1 403 禁止。我是否必须更改 php 访问文件的任何权限?我也尝试过使用 cUrl,但没有成功。
  • 在你的 .htaccess 中使用:SecFilterEngine Off 拒绝所有
【解决方案2】:

只需将您不希望公开访问的文件存储在 webroot 之外

/home
   example.txt
   /www
      readfile.php

如果 /home/www/ 是您的公共 webroot 文件夹,则它上面的任何文件都无法通过 web 服务器访问。 readfile.php 仍然可以在 ../example.txt 上完美访问文件。

【讨论】:

  • 哇...我怎么没想到呢?谢谢!
【解决方案3】:

如果您需要将文件存储在 webroot 中,请将文件放在文件夹中并拒绝访问该文件夹。如果您使用的是 apache,请在文件夹中创建一个 .htaccess 文件并输入deny from all

【讨论】:

    【解决方案4】:

    我做过类似的事情,其中​​文件包含极其敏感的信息,我只希望经过验证的用户能够通过 HTTPS 连接检索文件。

    我做的是这样的:

    我将文件放置在 Web 服务器(对我来说是 Apache)可以看到的范围之外的目录路径中。因此,没有可能的 URL 会导致文件直接由 Web 服务器提供。然后我创建了一个脚本,允许用户登录,点击他们想要的文件,然后 PHP 脚本读取文件,放置适当的标题,然后将文件流式传输到用户的计算机。

    当然,向用户显示文件列表的脚本和将文件流式传输给用户的脚本必须至少对存储路径中的文件具有读取权限。

    祝你好运!

    【讨论】:

      【解决方案5】:

      您可以将文件“example.txt”放在公用文件夹之外,并从 readfile.php 中读取,例如 $content = file_get_contents("../example.txt");

      【讨论】:

        【解决方案6】:

        您可以像这样调用文件而人们看不到文件名:

        <?php
        $file = 'example.txt';
        
        if (file_exists($file)) {
            header('Content-Description: File Transfer');
            header('Content-Type: application/octet-stream');
            header('Content-Disposition: attachment; filename='.basename($file));
            header('Content-Transfer-Encoding: binary');
            header('Expires: 0');
            header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
            header('Pragma: public');
            header('Content-Length: ' . filesize($file));
            ob_clean();
            flush();
            readfile($file);
            exit;
        }
        ?>
        

        (来源:php.net)

        这对你有用吗?

        【讨论】:

          【解决方案7】:

          快速破解 - 将您的文件重命名为“.cannotReadFileWithDOT”。他的服务器将关闭读取名称开头带有点的文件,但您的脚本将能够读取它们。优点是开箱即用的 apache 和 nginx 服务器被配置为禁止读取名称以点开头的文件。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-10-24
            • 2011-02-10
            • 2022-11-28
            • 1970-01-01
            • 1970-01-01
            • 2011-12-17
            • 2014-06-04
            • 1970-01-01
            相关资源
            最近更新 更多