我有一个存储有关人员个人数据的网站。所有这些信息都在数据库中,允许访问此信息的页面受密码保护。但是,最近我不得不保留包含这些信息的PDF文件。这些PDF存储在服务器的文件夹中。我在该文件夹中放了一个index.html
,以防止查找。
但是,我担心像HTTrack
这样可以进行递归查找的网站复印机。我无法访问.htaccess
,因为托管服务不允许这样做。
如何以安全的方式存储PDF?我正在使用php
和MySQL
。
答案 0 :(得分:2)
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脚本可以对用户进行正确的验证。
但首先,您应该检查您的主机是否允许您将文件放在不公开的文件夹中。如果您可以将文件存储在非公共文件夹中,那么您的状态就会很好。