在服务器上存储私有图像的正确方法?

Proper method of storing private images on server?

我写了一个 PHP 脚本来检索不在 public_html 文件夹下的图像。该脚本验证用户是否有权查看图像,然后显示它。图片权限设置为“0755”

这是防止其他人查看私人图像的安全方法吗?散列图像文件名会增加任何安全优势吗?是否有任何其他替代方法可以改进此脚本?

image_retrieval.php

的脚本
<?php
include '../user_verification.php';
$image_request = $_GET['image_request'];
$pic = file_get_contents("/home/username/images/'.$image_request.'");
header('Content-type: image/jpeg');
echo $pic;
?>

display_image.php

的脚本
    <?php
include '../world/verification.php';
$image_request = $_GET['image_request'];
echo"<img src='http://www.domainname.com/request_image.php?userid=$userid&image_request=$image_request'>";
?>
<form id='image_requester' method='get' action='display_image.php'>
    <input type="text" id="image_request" name="image_request">
    <input type="hidden" value="<?echo"$userid";?>" id="userid" name="userid">
    <input type="submit" value="request">
</form>

由于图片不公开,所以已经足够好了。散列名称的唯一好处是它们会更加独特,您可以将它们全部存储在一个目录下,但如果您真的想要,我建议您使用时间戳,因为它不会与其他图像发生冲突!

否则,仅当身份验证层以某种方式受到威胁时,将图像存储为哈希值才会有用。但如果发生这种情况,那么很快就会有人可以列出其中的所有内容。

从你上面发布的代码来看,似乎所有图像都在一个地方,我要做的是分别存储每个用户的图像,这样即使 auth 层以某种方式对一个人造成损害,也只有那个人的图像处于危险之中而不是每个人的。如果需要,按照您所说的对它们进行散列处理,或者将它们存储为不会相互冲突的名称,同时将对该图像的引用存储在数据库中。

在 PHP 中,脚本处理身份验证,一旦通过验证,它将设置一些响应 headers 和 'X-Sendfile' 告诉网络服务器传送文件;脚本结束,网络服务器接管。

检查这个:

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