【发布时间】: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