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