保护Web服务器中的PDF免受公共访问

时间:2013-07-11 23:55:21

标签: php mysql security

我有一个存储有关人员个人数据的网站。所有这些信息都在数据库中,允许访问此信息的页面受密码保护。但是,最近我不得不保留包含这些信息的PDF文件。这些PDF存储在服务器的文件夹中。我在该文件夹中放了一个index.html,以防止查找。

但是,我担心像HTTrack这样可以进行递归查找的网站复印机。我无法访问.htaccess,因为托管服务不允许这样做。

如何以安全的方式存储PDF?我正在使用phpMySQL

3 个答案:

答案 0 :(得分:2)

当他建议你使用php脚本将文件内容写入HTTP响应而不是直接链接到文件时,

apartridge说得对。

但是,当需要保护敏感文件以防止未经授权的访问时,还有一个步骤:将文件移动到服务器上无法从Web访问的目录。我不熟悉php,所以我会以asp.net网站为例,但你应该能够顺利进行。

在Windows中,网站的路径可能是C:\inetpub\wwwroot\MyWebsite\Index.html

我会将文件存储在C:\WebsiteFiles\之类的内容中,因此无法从网络上访问这些文件。现在,您可以通过php脚本控制访问,而不必担心猜测文件名的人或脚本。

答案 1 :(得分:1)

首先 - 请不要冒犯此事 - 您提出这个问题表明您没有资格编写处理个人信息的软件。即使你正确地解决这个问题,你也可能犯其他错误。我建议花一些时间在OWASP website上,并对Web应用程序安全性有一个基本的了解。

接下来,您不应将PDF文件放在可公开访问的Web文件夹中。如果有人将URL(无论文件名是多么巧妙地散列)转发给不应该访问它的人,那么您的安全模型就会中断。禁止文件枚举是不够的 - 您不应允许任何人在不输入凭据的情况下访问PDF文件。

您可以使用.htaccess文件轻松完成此操作 - 如果您的托管服务提供商不支持,我会质疑他们是否适合托管敏感数据的项目。

如果你真的必须,你可以创建一个“传递”PHP脚本。因此,如果URL为http://myserver.com/personalPDF.php?personID=JoeBlogs,则文件personalPDF将使用以下伪代码

if user is not logged in
  redirect to log-in page

if user does not have access to requested document
  redirect to "unauthorized" page

set PDF mime type
read requested document from disk and send to client

在PHP中,最后两行是:

<?php
$file="JoeBlogs.pdf";
header('Content-disposition: attachment; filename='.$file);
header("Content-type: ".mime_content_type($file));
header('Content-Transfer-Encoding: binary');
ob_clean();
flush();
readfile($file);
?>

答案 2 :(得分:0)

如果您有index.html文件,将阻止服务器列出目录内容。现在,您必须担心人们猜测文件的文件名。你可以用神秘的名字存储它们。看一下哈希函数来生成随机字符串。

当您让用户下载文件时,您应该使用PHP脚本来读取文件的内容并发送正确的MIME标头。你不应该直接链接到神秘的名字,以保持这些名称的秘密。然后,PHP脚本可以对用户进行正确的验证。

但首先,您应该检查您的主机是否允许您将文件放在不公开的文件夹中。如果您可以将文件存储在非公共文件夹中,那么您的状态就会很好。