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

Php 保护Web服务器中的PDF不受公共访问,php,mysql,security,Php,Mysql,Security,我有一个网站存储个人资料的人。所有这些信息都在数据库中,允许访问这些信息的页面都受密码保护。然而,最近我不得不保留包含一些此类信息的PDF文件。这些PDF存储在服务器的文件夹中。我已在该文件夹中放置了一个index.html,以防止查找 然而,我担心像HTTrack这样的网站复印机会进行递归查找。我无法访问.htaccess,因为托管服务不允许这样做 如何以安全的方式存储PDF?我正在使用php和MySQL 如果您有一个index.html文件,该文件将阻止服务器列出目录内容。现在,您必须担心人

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

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


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

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

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


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

apartridge建议您使用php脚本将文件内容写入HTTP响应,而不是直接链接到文件,这是正确的

但是,当需要保护敏感文件不受未经授权的访问时,还有一个步骤:将文件移动到服务器上无法从web访问的目录。我对php不太熟悉,所以我将使用asp.net站点作为示例,但您应该能够很好地理解

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


我会将这些文件存储在类似
C:\WebsiteFiles\
的东西中,这样这些文件就无法从web访问。现在,您可以通过php脚本控制访问,而不必担心人们或脚本猜测文件名。

首先-请不要对此感到生气-您提出这个问题的事实表明您没有资格编写处理个人信息的软件。即使你正确处理了这个问题,你也可能会犯其他错误。我建议您花些时间在web应用程序上,并对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);
?>


递归复制文件的网站复印机怎么样?它会不会得到PDF文件,大概神秘的名字在这里不会有帮助?我不知道它怎么可能。它查找网页上的所有链接,并递归地打开这些网页。如果你从未链接到你的PDF,即将其隐藏和未列出,你应该很好。如果有人通过书签、浏览器历史记录、在线流量检查(原始问题未指定站点使用SSL)访问链接,或者有人意外共享电子邮件,该怎么办?这个答案中的策略通常被称为“通过默默无闻实现安全”,这通常是不受欢迎的。至少,让链接“一次性使用”——它们应该在第一次使用后过期。这在我的第一条评论中提到。