8

我在做什么:

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

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

-

我需要帮助:

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

你如何防止这种情况。如果没有成功通过登录页面,我不想在我的服务器上查看任何文件。

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

4

3 回答 3

6

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

PHP 脚本处理身份验证,一旦验证,它将设置一些响应标头和一个“X-Sendfile”,告诉 Web 服务器发送文件;脚本结束,Web 服务器接管。

请参阅此处以获取一个简单的示例:

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

于 2012-05-10T08:33:31.730 回答
1

这对于您的情况来说可能有点过头了,但这就是我正在考虑在我正在开发的应用程序上这样做的方式:

首先,有4个服务器,一个web服务器,一个中间件服务器,一个数据服务器

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

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

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

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

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

于 2012-08-13T04:12:41.973 回答
0

你可以这样做 像这样在php中编写资源服务

image.php?requestid=.....

在该文件中,您获取 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;

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

于 2012-05-10T08:26:38.310 回答