用户上传的图像具有可预测的文件名是一个坏主意吗?或者它们应该是随机生成的


Is it a bad idea for user-uploaded images to have predictable file names? Or should they be randomly generated?

我想让用户上传图片,我的计划是只用他们的用户名命名图片文件,以便于参考。但我突然想到,大多数允许上传图像的网站通常会为文件名生成一串随机数字。这样做有什么(安全)优势吗?还是只是开发人员的一个无关的决定?

对我来说,使用用户名的好处是我不需要在数据库中为每个用户存储数字字符串,并且可以仅通过用户名引用图像。

主要的安全问题是"信息泄露"。例如,如果您的用户可以选择不公开可见,则猜测您的命名约定的攻击者可以检索"隐藏"用户的照片;这可能不是用户想要的。

使用数字文件名 - 从"1.jpg"开始,递增 - 会泄漏其他信息;任何人都可以通过增量请求文件并查看他们何时收到 404 错误来了解您有多少用户。

从软件设计的角度来看,在许多情况下,您不希望使用用户名作为主键 - 例如,用户名可能会更改(特别是如果您使用电子邮件地址作为用户名)。你的数据库主键应该是一些不可变的、唯一的东西,比如 (G)(U)UID。这很可能是您在查看其他站点的用户照片时看到的文件名。

当然,如果您允许用户上传多张照片,则使用主键也不起作用 - 因此您必须在"约定"之间进行选择 - 例如为每个用户提供一个照片文件夹,通过某种方式找出该文件夹中有多少图像,或者将这些图像路径显式存储在数据库中。在这两种情况下,对用户使用主键可能都不够......

我相信这主要是一个命名空间问题。

随机化 URL(我知道的)的主机允许在没有用户帐户的情况下上传 - 所以你的方法行不通。使用随机文件夹/文件命名可以最大限度地减少人们两次上传同一文件名的冲突。

如果您永远不需要接受匿名上传,我会说这取决于您如何组织用户文件和避免命名空间冲突的个人喜好......

建议 - 去找给你独特性的东西。例如 - 如果我要上传我的个人资料图片,我可能会像me.jpg一样命名它,下次登录时,我希望我的照片从屏幕上看着我,图片的名称与我作为用户无关

因此,如果您确实将其重命名为Pavel_Janicek_me.jpgdflw00axxwe.jpg 这真的无关紧要。只要你展示我自己的照片。

如果允许用户上传多张图片,请考虑一些编号。重命名应该可以解决以下错误:

  • 两个不同的用户上传具有完全相同名称的图片
  • 一个用户上传两张同名的不同图片