9

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

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

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

我可能在我的头上,但我通常是,所以任何输入都会很棒。

4

3 回答 3

9

将文件放在 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;
?>
于 2012-05-24T19:13:58.447 回答
4

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

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

于 2012-05-24T19:16:51.900 回答
2

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

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

于 2012-05-24T19:19:39.927 回答