gpt4 book ai didi

php - 如何在文件系统中存储私有(private)用户图像而不妨碍他们的隐私?

转载 作者:可可西里 更新时间:2023-11-01 09:03:56 27 4
gpt4 key购买 nike

我有一个项目处理存储用户的敏感私有(private)图像或其他文件。我对在文件系统或数据库中存储图像等文件做了一些研究。

我决定像 facebook 一样将它们存储在 CDN 中。但是,我如何确保某人不会仅仅通过修改 URL 和替换随机字符来破坏他人的隐私?

例如:假设我的CDN文件系统中有两张图片,

由user1上传- https://somecdnlink.com/somelocation/1234abc-5678pqr.jpg

由user2上传- https://somecdnlink.com/somelocation/1234abc-5679pqr.jpg

现在 user2 在上传他们的图片后决定检查图片 url。他们刚刚上传的图像弹出,暴露了它的存储位置。 然后他决定检查如果他递减数字 9 并在那个地方写 8 会发生什么。

这将自动打开 user1 存储在 cdn 服务器中的图像,该图像应该是私有(private)的。

如何确保 user2 无法访问文件系统中其他用户的图像?像巨头这样的 Facebook 如何做到这一点?

图像可能非常大,可能存在大约数百万张这样的图像。

我可以尝试随机化文件名并可能进行散列和其他操作,但是尝试所有可能的排列的暴力攻击很容易暴露大量图片。

此外,在这种情况下,存储在数据库中是否比 cdn 更好?

我正在使用 php 和 mysql。

最佳答案

您可以使用以下方法之一

<强>1。 Security through Obscurity (不推荐,但很简单!)

通过创建足够大的哈希前缀(例如,随机的 64 个字符字母数字),它的熵对于任何当前的暴力破解方法来说都是一种矫枉过正。如果有人仍然坚持,那么你应该担心其他问题。

不过需要注意的是,您的图像将具有如此庞大的图像名称(尽管我已经在许多网站上看到过这种做法)。

然后你可以通过php算法维护访问控制,至于谁有这个图片的链接。

<强>2。通过 php 流式传输文件。 (推荐,需要额外编码)

通常,每当通过 Apache 访问不可执行文件时,它就会开始输出带有相应 header 的文件内容。但是,如果访问一个可执行文件(Apache 已加载的模块),Apache 不会直接输出文件,而是将执行请求发送到相应的模块,一旦模块完成脚本的执行,它就会发回输出到 Apache,然后发送到客户端。

在这里你可以制作一个 .php 文件来处理所有的文件访问,你可以在里面执行你想要执行的所有身份验证/授权检查,一旦所有者确认你就可以发送通过 php 文件如下所示。

// After validating the user is logged-in and is the rightful owner of the said file.

// the file you want to send, the user doesnt need to know this, it could we outside of the webroot too, just make sure php has access to it.
$path = "secret/path/to/the/file/to/be/downloaded";

// the file name of the download
$public_name = basename($path);

// get the file's mime type to send the content type header
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime_type = finfo_file($finfo, $path);

// send the respective headers
header("Content-Disposition: attachment; filename=$public_name;");
header("Content-Type: $mime_type");
header('Content-Length: ' . filesize($path));

// stream the file
$fp = fopen($path, 'rb');
fpassthru($fp);
exit;

关于php - 如何在文件系统中存储私有(private)用户图像而不妨碍他们的隐私?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34988928/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com