【问题标题】:Amazon S3 presigned url - Invalidate manually or one time uploadAmazon S3 预签名 URL - 手动或一次性上传无效
【发布时间】: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 仍然有效的情况下,永远不要告诉你他们已经完成/上传了另一个。

标签: php amazon-web-services file-upload amazon-s3 aws-lambda


【解决方案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
    猜你喜欢
    • 2018-12-27
    • 1970-01-01
    • 2017-02-15
    • 2021-10-18
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 2018-12-24
    相关资源
    最近更新 更多