为PDF创建安全文件托管服务器

时间:2012-05-24 19:11:58

标签: php pdf ftp

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

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

该网站位于LAMP,我的最小经验位于PHP(但如果框架或其他语言可以使这更容易,我可以学习它。)

我可能在我脑海中,但我通常都是,所以任何输入都会很棒。

3 个答案:

答案 0 :(得分: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;
?>

答案 1 :(得分:4)

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

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

答案 2 :(得分:2)

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

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