我刚刚意识到,如果允许浏览器将文件上传到我的S3存储桶(使用服务器上的会话令牌),则攻击者可以使用已知的对象密钥来使用这些临时权限来覆盖这些文件(并且替换为恶意或空内容。
有人说解决方案是使用对象版本控制,但是我想知道lambda函数是否可以拦截该PutObject请求,检查存储桶中是否已存在密钥,如果存在,则拒绝该操作。
答案 0 :(得分:0)
简短的回答是“否”。
这是因为S3最终是一致的。即使您做了一些聪明的尝试,例如尝试getObject
来查看文件是否存在,但在攻击者期望快速启动的繁重负载下,您也很可能会得到假阴性。
如果要确保签名的URL可以使用一次且只能使用一次,则必须用自己的签名的URL功能替换。一个示例是使用API网关+ Lambda + DynamoDB。在这种情况下,您将创建一个“上传令牌”,将其保存到DynamoDB并返回给用户。然后,当用户使用令牌上传文件时,该文件将从DynamoDB中删除(可以使其立即保持一致)。