Amazon S3 预签名网址 - 手动或一次性上传失效


Amazon S3 presigned url - Invalidate manually or one time upload

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

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

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

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

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

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

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

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

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

上传文件后,让 Lambda 将其移动(使用复制对象 API),即从uploads/123.png移动到received/123.png或类似的东西。

如果恶意用户尝试重复使用签名的 URL,它将转到 uploads/123.png 。最坏的情况是,Lambda 会再次检查它并拒绝新文件。由于您的服务器正在查找received/而不是uploads/文件进行处理,因此我们使事情变得安全。