我正在开发一个网站,允许客户登录并查看服务器上保存的各种PDFs
。这些PDF对于客户来说是独一无二的,并且不应该由未登录的人访问。将文件放到服务器上应该不是问题,我只是不确定如何向最终用户提供这些文件。 / p>
我已经使用来自SQL servers
的数据而不是文件来实现这种事情,所以我不完全确定最有效的方法是什么。
该网站位于LAMP
,我的最小经验位于PHP
(但如果框架或其他语言可以使这更容易,我可以学习它。)
我可能在我脑海中,但我通常都是,所以任何输入都会很棒。
答案 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}},您只需从数据库而不是文件中发送数据。
这样做的好处是不必确保没有文件名冲突等。