2012-09-30 71 views
8

我的应用用户将其文件上传到一个存储桶。我如何确保S3存储桶中的每个对象都有唯一的密钥以防止对象被覆盖?Amazon S3为每个对象创建唯一的密钥

目前,我正在用我的php脚本中的一个随机字符串加密文件名,然后将文件发送到S3。

为了讨论起见,我们假设上传者找到一种方法来操纵上传文件名。他想用我的网站上的所有图片替换banana的图片。如果加密失败,防止在S3中覆盖文件的好方法是什么?

编辑:我不认为版本控制将起作用,因为我无法在显示来自我的存储桶的图像时在图像URL中指定版本ID。

回答

3

你是加密还是哈希?如果您正在使用md5或sha1哈希,攻击者可能很容易发现哈希碰撞并让您滑入香蕉皮。如果您在没有随机初始化向量的情况下进行加密,攻击者可能会在上传几百个文件后推断您的密钥,并且加密可能不是最好的方法。这在计算上是昂贵的,难以实施,并且您可以用较少的努力为此工作获得更安全的机制。

如果预先为每个文件名添加一个随机字符串,使用合理可靠的熵源,则不应该有任何问题,但是您应该检查文件是否已经存在。尽管使用S3::GetObject编码循环来检查并生成一个新的随机字符串对于几乎永远不需要运行的内容来说似乎是一个很大的努力,但“几乎从不”意味着它最终发生的可能性很高。

+0

谢谢你的回复!我正在加密到一个随机字符串。我想检查一下,如果文件已经存在是最好的解决方案,即使我提出一个额外的S3请求。或者,如果我将所有文件信息存储在数据库中,我可以使用mysql检查数据库表。 – CyberJunkie

+1

正如我上面提到的,加密文件名并不是最有效的解决方案。您可以用随机字符串替换名称,并将映射存储在数据库中。看'openssl_random_pseudo_bytes()'。 –

+2

@TerenceJohnson,“几乎从来没有”可以通过增加更多的随机比特而“任意地不可能”。多做一次S3的旅程会损害你的服务时间。 – Fantius

0

在上传之前检查具有该名称的文件是可行的。

如果文件已经存在,请重新随机化文件名,然后重试。

+11

在您检查完数据并放入数据之前,可以创建一个具有该名称的文件。也就是说,这两个操作不在交易中。 – ivant

相关问题