我正在使用 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/
文件进行处理,因此我们使事情变得安全。