ZF2:如何将安全图像作为网页的一部分提供

DatsunBing

我已经构建了一个包含用户个人资料的ZF2应用程序,现在我希望允许用户上传和显示其照片作为其个人资料的一部分。就像您在LinkedIn中看到的一样。

上传照片似乎很容易(使用Zend\InputFilter\FileInput())。我的工作很好。

在我看来,将它们存储在网络根目录之外非常有意义。(例如,我不必担心用户在目录上使用wget)。但是,如何将这些图像嵌入到网页中呢?

如果它们在网络根目录中,我会简单地做,<img width="140" src="/img/filename.jpg">但是显然,如果它们在安全的位置,那是不可能的。有什么解决方案?

雅各布·布丁(Jacob Budin)

你是对的。传统上,Web开发人员会混淆用于存储图像的路径,以防止恶意人员批量检索图像(正如您所提到的那样wget)。

因此,尽管存储用户的头像/uploads/users/{id}.jpg很简单(根据使用情况,不一定合适),但是您可以使用方法来混淆URL。请记住:有两种解决问题的方法。

更简单地说,您要确保不能基于“公共”信息(例如,用户的主键)来确定资产URL。因此,如果用户的用户ID为37,则访问他们的头像不会像download那样简单/uploads/users/37.jpg

一种更加有力的方法是确保一个人不能将URL与它的公共信息联系起来。像这样的网址会/uploads/users/37/this-is-some-gibberish.jpg“显示”其所有权;负责此内容的用户必须是ID为37的用户。

一个简单的解决方案

如果您想使用更简单的方法,请基于set属性(例如,用户的ID)和应用程序范围的盐生成快速哈希。对于PHP,请看“非加密用途的最快哈希?”。

$salt = 'abc123'; // Change this, keep it secret, store it as env. variable
$user->id; // 37
$hash = crc32($salt . strval($user->id)); // 1202873758

现在,我们有了一个唯一的哈希,可以将文件存储在此端点:/uploads/users/37/1202873758.jpg每当我们需要引用用户的头像时,我们都可以重复此逻辑以生成创建文件名所需的哈希。

碰撞问题

您可能想知道,为什么我不能将其存储在/uploads/users/1202873758.jpg这样不能确保我的用户身份安全吗?(如果您不知道,那就可以了,我会为其他读者解释。)可以,但是生成的哈希值不是唯一的;它不是唯一的。如果用户数量足够多,我们将使用其他用户的头像来覆盖文件,从而使我们的存储解决方案变得无能为力。

更隐秘

公平地说,/uploads/users/1202873758.jpg是一个更秘密的文件名。也许甚至/uploads/1202873758.jpg会更好。用这样的路径存储文件;我们需要确保唯一性,这不仅需要生成哈希,还需要检查唯一性,适应不可避免的冲突并存储(可能修改的)哈希,以及能够根据需要从存储中检索哈希。

根据您的应用程序堆栈,您可以实现无数种方法,根据您的需求,有些方法比其他方法更合适,因此在此我将不做介绍。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将图像放置在其他图像的一部分上

如何将一个UIViewController作为屏幕的一部分

作为函数的一部分,如何将小数转换为等效时间?

如何将背景色仅作为选择的一部分?的CSS

如何将特定表作为迁移的一部分 - Laravel 5?

如何将 TextureView 作为视图的一部分加载

在“处理”中,如何将窗口的一部分另存为图像?

如何将网页的一部分“流式传输”到另一个窗口?

作为 WSARecvFrom 调用的一部分,如何将缓冲区放入 CompletionROUTINE?

如何将Yocto构建模块fcntl作为Python构建的一部分

如何将函数调用的结果作为dplyr :: mutate的一部分展平?

如何批量绕过作为启动命令一部分的打开文件安全警告?

将图像拖到pygame中作为网格一部分的图块上

将标题作为CURL的一部分

如何将图像的一部分从父元素转移到子元素

如何在Flask中返回图像作为GET请求响应的一部分?

如何仅将我的精灵图像的一部分重复作为div的背景

如何使用 CV2 将图像的一部分剪切成单独的图像?

Gradle:您如何将自己的库作为构建的一部分?

如何将JSON作为多部分POST请求的一部分发送

如何显示大图像的一部分?

如何仅显示图像的一部分

如何淡化图像的一部分

如何仅分析图像的一部分?

如何使用CoordinatorLayout将视图作为RecyclerView的一部分移动

如何使用 JS 将 JS var 作为元素属性的一部分

Dovecot Sieve - 如何将消息的一部分作为变量检索

如何将GitHub Wiki作为源的一部分进行存储

如何将Webpack编译作为CircleCI配置的一部分运行