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

Amazon S3 presigned url - Invalidate manually or one time upload

我正在使用 S3 接受用户直接上传到 S3。因此我将使用预签名 urls.

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

然后我的服务器将检查该文件是否存在于 S3 中(如果 Lambda 检测到无效图像,则会将其删除)。如果是,则应用程序逻辑的其余部分将随之而来。

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

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

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

预签名 URL 在集合 date/time 时到期。 无法 创建一次性使用预签名 URL。

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

正在将其转化为答案...

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

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