我已经构建了一个包含用户个人资料的ZF2应用程序,现在我希望允许用户上传和显示其照片作为其个人资料的一部分。就像您在LinkedIn中看到的一样。
上传照片似乎很容易(使用Zend\InputFilter\FileInput()
)。我的工作很好。
在我看来,将它们存储在网络根目录之外非常有意义。(例如,我不必担心用户在目录上使用wget)。但是,如何将这些图像嵌入到网页中呢?
如果它们在网络根目录中,我会简单地做,<img width="140" src="/img/filename.jpg">
但是显然,如果它们在安全的位置,那是不可能的。有什么解决方案?
你是对的。传统上,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] 删除。
我来说两句