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