我在做什么:
我基本上需要创建一个由用PHP编写的登录页面保护的网站,一旦登录,你就会有一个读取整数的搜索栏,并将数据发送到一个PHP脚本,该脚本检索一个数字作为名称的图像
(我将在此服务器上存储几千张图像进行搜索 - 库存图片)
-
我需要帮助:
从我的研究中,我了解到你“不”使用MySQL等数据库来存储实际图像,因为速度和效率低下。如果您不将它存储在数据库中,并按照建议将其保留在服务器的文件系统上,如果有人在地址栏中键入直接URL,是否会将它们带到我服务器上的文件中?
你如何防止这种情况发生。如果没有成功浏览登录页面,我的服务器上的文件都不可查看。
感谢您的帮助,任何见解或建议都将不胜感激。这对我来说很重要,因为将来会添加更复杂的信息。
答案 0 :(得分:6)
通过PHP(或任何其他脚本)处理文件下载的推荐方法是使用所谓的“X-Sendfile”响应头。
PHP脚本处理身份验证,一旦经过验证,它将设置一些响应头以及一个告诉Web服务器传递文件的“X-Sendfile”;脚本结束,Web服务器接管。
请看这里的简单示例:
答案 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;
但我认为你不应该这样做,只需随机重命名文件并创建很多文件......