【问题标题】:Creating a Secure File Hosting Server for PDFs为 PDF 创建安全文件托管服务器
【发布时间】:2012-05-31 09:54:03
【问题描述】:

我正在开发一个网站,允许客户登录并查看保存在服务器上的各种PDFs。这些 PDF 对客户端来说是唯一的,并且不应该被未登录的人访问。将文件放到服务器上应该不是问题,我只是不确定如何将它们提供给最终用户。

我已经使用来自 SQL servers 的数据而不是文件来实现这种事情,所以我不完全确定最有效的方法是什么。

该网站在LAMP 上,我的最低经验是在PHP 上(但如果框架或其他语言可以让这更容易,我可以学习它)。

我可能有点不知所措,但我通常是这样,所以任何输入都会很棒。

【问题讨论】:

    标签: php pdf ftp


    【解决方案1】:

    将文件放在 webroot 之外。然后使用 PHP 通过脚本传递文件。这样,没有人可以直接链接到文件并绕过您的控制。 (当然要确保只有在验证用户有权检索该文件后执行此操作的脚本)。

    示例 PHP:

    <?php
        session_start();
        if (!isset($_SESSION['authenticated'])) {
            exit;
        }
        $file = '/path/to/file/outside/www/secret.pdf';
    
        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;
    ?>
    

    【讨论】:

    • 不应该加载session_start();吗?我认为它应该与会话一起使用。
    • 其实应该是的。我太专注于核心概念,我没有提供一个真正完整的例子。现在要解决这个问题...
    【解决方案2】:

    简单的方法是为这些文件指定长随机文件名(例如,20 个随机字符)。从技术上讲,任何人都可以访问它们,但无法猜测 URL,因此只有获得授权的人才能访问。

    另外,John Conde 已经概述了一种从 PHP 脚本提供文件的方法。它会导致轻微的性能损失,但会与您的代码一样安全。我唯一可以补充的是,如果你不能将它们放在 webroot 之外,那么你可以使用 .htaccess 来阻止人们直接访问这些文件。

    【讨论】:

    • 我建议使用 GUID。这仍然存在问题,我可以 ping 服务器,直到我得到一些有趣的东西,尽管你可以使成功的机会变得非常小。我确实支持使用 .htaccess 来阻止对文件夹的访问。
    • @zebediah49 - 这是一种可能性,但您应该注意there are pitfalls。简单地生成一个随机字符串更安全。而且,如果您想 110% 确定,请使用加密强的随机数生成器。
    • 非常有趣,谢谢。我选择了 GUID 作为长度,但我仍然会避免使用可公开访问的 URL,但这是一个很好的观点。
    • GUID 有 32 个字符,但每个字符只有 16 种可能性。来自 a-z9-9 的 20 个随机字符,每个位置有 36 种可能性。
    【解决方案3】:

    John 发布了主要的正确方法,因此我添加了(可能较差的)替代方法:从数据库中提供它。只需为 PDF 设置一个 BLOB 列,然后从数据库中读取/存储文件数据。你最终会得到一张相当大的桌子,但它会起作用。服务它需要设置与 John 发布的相同的 header()s,您只需从数据库而不是文件发送数据。

    这样做的好处是不必确保您没有文件名冲突等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-30
      • 1970-01-01
      • 2010-09-24
      • 2012-08-23
      • 1970-01-01
      • 2019-07-27
      • 2013-10-04
      • 2016-07-08
      相关资源
      最近更新 更多