Amazon S3 预签名 URL - 手动或一次性上传无效

Posted

技术标签:

【中文标题】Amazon S3 预签名 URL - 手动或一次性上传无效【英文标题】:Amazon S3 presigned url - Invalidate manually or one time upload 【发布时间】:2016-08-15 10:50:59 【问题描述】:

我正在使用 S3 接受用户直接上传到 S3。因此,我将使用预签名的网址。

上传成功后,AWS Lambda会确保文件上传是图片,然后客户端会告诉我的服务器他已经上传完成了。

然后我的服务器将检查该文件是否存在于 S3 中(如果 Lambda 检测到无效图像,它将删除它)。如果是这样,那么其余的应用程序逻辑将遵循。

但是,这个机制存在一个漏洞。用户在告诉我的服务器他已完成上传(并最初传递了一个有效文件)后,可以使用相同的 url 上传恶意文件。

Lambda 仍会删除该文件,但现在我的服务器会认为该文件存在而实际上并不存在。

有没有办法生成一次性上传预签名的 url,或者是否可以强制使生成但尚未过期的 url 无效?

【问题讨论】:

您不能让 Lambda 将有效文件移动到其他地方以供服务器操作吗? 其他地方是什么意思?如果我的服务器必须从 s3 下载文件,我想要实现的将是无效的。我不希望我的服务器为文件 IO 带来任何带宽 好吧,如果文件上传到 uploads/123.png,让 Lambda 使用 docs.aws.amazon.com/AmazonS3/latest/dev/… 将其移动到 received/123.png。随后重复使用签名 URL 将再次将其放入 uploads,但您的服务器将检查 received 中的有效文件,因此恶意用户失败。 哇,简单优雅。非常感谢 我知道我来晚了,但是您应该使用此方法将生命周期策略(在 X 天后删除文件)添加到您的上传密钥前缀,因为用户可以上传文件在 URL 仍然有效的情况下,永远不要告诉你他们已经完成/上传了另一个。 【参考方案1】:

预签名 URL 在设定的日期/时间过期。 不可能创建一次性使用的预签名 URL。

也不能使预签名 URL 无效。但是,预签名 URL使用来自预签名 URL 引用的访问密钥的权限。如果从链接到访问密钥的用户中删除权限,则预签名 URL 将不起作用。

【讨论】:

【参考方案2】:

把它变成一个答案......

上传文件后,让 Lambda 移动它(使用Copy Object API),即从uploads/123.pngreceived/123.png 或类似的东西。

如果恶意用户尝试重复使用签名 URL,它将转到 uploads/123.png。最坏的情况是,Lambda 再次检查并拒绝新文件。由于您的服务器在 received/ 而不是 uploads/ 中查找要处理的文件,因此我们已将其呈现为安全状态。

【讨论】:

不过有时间问题;在 lamda 执行之前有一个窗口。 我觉得这应该作为 S3 功能来支持,而不是解决。使用预签名的 S3 对象一次性上传/下载 url。 这行不通。当您上传到 S3 时,它总是会创建该文件夹(如果不存在)。 @iAviator 没关系。这就是这个答案的重点。预签名的 URL 只允许用户上传到uploads,而不是received,因此如果文件已经被接收和处理,服务器知道忽略该文件。 @iAviator 否,因为应该设置 Lambda 脚本来检查 received/abc.json 是否存在。如果它已经存在,它应该拒绝重新处理重复的upload/abc.json

以上是关于Amazon S3 预签名 URL - 手动或一次性上传无效的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 amazon sdk 为虚域生成预签名的 Amazon S3 url?

如何使用预签名的 url 将对象放入 amazon s3?

使用预签名 URL 上传到 Amazon S3 时限制对象大小

使用预签名 URL 将文件上传到 Amazon S3 时出现 CORS 错误

Android 中 Amazon S3 预签名 URL 的改进

如何保护 Amazon S3 URL