如何在服务器上安全地存储文件

时间:2012-05-10 08:16:36

标签: php mysql database image

我在做什么:

我基本上需要创建一个由用PHP编写的登录页面保护的网站,一旦登录,你就会有一个读取整数的搜索栏,并将数据发送到一个PHP脚本,该脚本检索一个数字作为名称的图像

(我将在此服务器上存储几千张图像进行搜索 - 库存图片)

-

我需要帮助:

从我的研究中,我了解到你“不”使用MySQL等数据库来存储实际图像,因为速度和效率低下。如果您不将它存储在数据库中,并按照建议将其保留在服务器的文件系统上,如果有人在地址栏中键入直接URL,是否会将它们带到我服务器上的文件中?

你如何防止这种情况发生。如果没有成功浏览登录页面,我的服务器上的文件都不可查看。

感谢您的帮助,任何见解或建议都将不胜感激。这对我来说很重要,因为将来会添加更复杂的信息。

3 个答案:

答案 0 :(得分:6)

通过PHP(或任何其他脚本)处理文件下载的推荐方法是使用所谓的“X-Sendfile”响应头。

PHP脚本处理身份验证,一旦经过验证,它将设置一些响应头以及一个告诉Web服务器传递文件的“X-Sendfile”;脚本结束,Web服务器接管。

请看这里的简单示例:

http://www.jasny.net/articles/how-i-php-x-sendfile/

答案 1 :(得分:1)

这可能对你的情绪有点过​​分,但这就是我正在考虑在我正在开发的应用上做这件事:

首先,有4台服务器,一台Web服务器,一台中间件服务器和一台数据服务器

当有人向Web服务器发送请求时,Web服务器连接到中间件服务器并请求该文件,传递用户凭证,如会话密钥和请求的文件。中间件连接到数据库并验证用户对该文件的权限的会话和。如果有访问权限,它将返回错误或二进制数据。如果在Web服务器和中间件服务器上关闭输出缓冲,则可以从中间件服务器向Web服务器发送100k块,并且Web服务器将在接收第二个块时输出第一个块。

文件本身可以通过ftp,sftp或其他文件共享存储在数据库服务器上

它绝对不如使用x-sendfile那么高效,但如果有人能够使用你的网络服务器,他们仍然无法访问该文件 - 在上述情况下,他们会这样做。 Web服务器是唯一的公共服务器,因此其余服务器应该在专用网络上连接。

您还可以将数据发送到将加密/解密实际文件数据的加密服务器

如果有人对如何改进这个有任何想法,我很感兴趣。

答案 2 :(得分:0)

你可以这样做 像这样写一个资源服务器

image.php?requestid=.....

在该文件中,您获取请求并从数据库中读取实际链接(本地链接),读取图像文件,然后将数据输出到浏览器

$id = $_GET['requestid'];
$link = get_local_link_from_id($id);  // return /images/file1.png......
$data = file_get_contents($link);
header('Content-Type', 'image/png');
echo $data;

但我认为你不应该这样做,只需随机重命名文件并创建很多文件......