我想允许用户直接从浏览器上传文件到S3存储桶。我已经看到了在服务器上签署策略文档的一些建议,以及其他建议在服务器上创建预签名URL并将其传递回客户端的建议。
例如,这个Django REST Framework库为两者提供了选项: https://github.com/bodylabs/drf-to-s3
从安全角度来看,有哪些优点/缺点?
答案 0 :(得分:1)
从安全角度来看,没有任何有意义的差异。
签名网址与PUT
一起使用,而签名的政策文件与POST
一起使用。
两者都使用在计算上不可行的签名算法进行逆向工程。
两者都允许您限制可以写入/覆盖的存储桶和密钥。 POST
更灵活,允许您(通过策略)允许(通过策略)目标对象键匹配前缀而不是精确字符串,这可能不是您想要做的事情。
两者都有过期机制。
两者都不受篡改的影响,因为无法以允许执行除预期动作(由签名授权)之外的动作的方式修改请求。
POST
上传的一个可能的小优势是策略文档允许您为上传指定有效的大小范围。 PUT
要求允许任意大小或通过在服务器签名的标头列表中包含Content-Length
标头来指定精确的字节大小,这需要使用签名版本4.(较旧的S3区域也支持签名版本2,虽然不太复杂但很容易实现,但所有地区都支持V4。)
从流程/流程的角度决定哪一个对您最有意义,了解它真正真正做什么做什么,并且不应该有任何与安全相关的理由一个在另一个上面。
答案 1 :(得分:0)
不要重新发明轮子。考虑使用像fineuploader这样的库,它现在是免费的,并且在django端有一个很好的例子(代码表示URL可以直接上传到S3)。该库具有许多优秀的功能,包括将文件分成小部分。我用它来成功加载非常大的视频文件(16GB +)。
(如果这不是OP的直接答案,但可能会使答案变得不那么重要,请道歉)