我的应用用户将他们的文件上传到一个存储桶。如何确保我的 S3 存储桶中的每个对象都有唯一的密钥以防止对象被覆盖?
目前,在将文件发送到 S3 之前,我在我的 php 脚本中使用随机字符串加密文件名。
为了便于讨论,我们假设上传者找到了一种在上传时操纵文件名的方法。他想用香蕉图片替换我网站上的所有图片。如果加密失败,有什么好方法可以防止覆盖 S3 中的文件?
编辑:我认为版本控制不起作用,因为在显示存储桶中的图像时,我无法在图像 URL 中指定版本 ID。
我的应用用户将他们的文件上传到一个存储桶。如何确保我的 S3 存储桶中的每个对象都有唯一的密钥以防止对象被覆盖?
目前,在将文件发送到 S3 之前,我在我的 php 脚本中使用随机字符串加密文件名。
为了便于讨论,我们假设上传者找到了一种在上传时操纵文件名的方法。他想用香蕉图片替换我网站上的所有图片。如果加密失败,有什么好方法可以防止覆盖 S3 中的文件?
编辑:我认为版本控制不起作用,因为在显示存储桶中的图像时,我无法在图像 URL 中指定版本 ID。
你是加密还是散列?如果您使用 md5 或 sha1 哈希,攻击者很容易发现哈希冲突并让您在香蕉皮上滑倒。如果您在没有随机初始化向量的情况下进行加密,则攻击者可能会在上传数百个文件后推断出您的密钥,而加密可能不是最好的方法。它的计算成本很高,难以实现,而且你可以用更少的努力获得更安全的机制来完成这项工作。
如果您使用合理可靠的熵源为每个文件名添加一个随机字符串,那么您应该没有任何问题,但您应该检查该文件是否已经存在。尽管编写一个循环来检查、使用S3::GetObject
和生成一个新的随机字符串对于几乎不需要运行的东西来说似乎需要付出很多努力,但“几乎从不”意味着它最终很有可能发生。
在上传之前检查具有该名称的文件会起作用。
如果文件已经存在,重新随机化文件名,然后重试。