我想让用户直接从浏览器上传文件到S3存储桶。我已经看到了一些关于在服务器上签署策略文档的建议,还有一些建议在服务器上创建一个预先签名的URL并将其传递回客户端。安全的基于浏览器的S3上传:已签名的策略文档或预先登记的URL?
例如,这Django的REST框架库提供了两个选项: https://github.com/bodylabs/drf-to-s3
什么是从安全的角度来看,优势/劣势?
我想让用户直接从浏览器上传文件到S3存储桶。我已经看到了一些关于在服务器上签署策略文档的建议,还有一些建议在服务器上创建一个预先签名的URL并将其传递回客户端。安全的基于浏览器的S3上传:已签名的策略文档或预先登记的URL?
例如,这Django的REST框架库提供了两个选项: https://github.com/bodylabs/drf-to-s3
什么是从安全的角度来看,优势/劣势?
从安全角度来看,没有任何意义上的差异。
签署的网址与PUT
工作,而签约政策文件与POST
工作。
两者都使用签名算法是计算,是不可行的逆向工程。
两者都允许您限制可以写入/覆盖的存储桶和密钥。 POST
更灵活,允许您选择允许(通过策略)目标对象键来匹配前缀而不是确切的字符串,而这不可能是您想要做的事情。
两者都有到期机制。
两者都是免疫在这个意义上的篡改,这是不可能修改的方式,允许比将要执行的期望的一个(由签名授权)以外的动作的请求。的POST
上传
一个可能的次要优点是政策文件允许你指定一个有效的尺寸范围上传。 PUT
要求允许任何大小或通过将Content-Length
标头包括在由服务器签名的标头列表中来指定精确的大小(以字节为单位),这需要使用签名版本4.(较旧的S3区域还支持签名版本2,但略微更容易实现,但所有地区都支持V4)
决定哪一个从进程/流的角度看是很有道理的给你,明白了什么是真的引擎盖下做的,应该没有安全相关理由相互支持。
不要重新发明轮子。考虑使用像fineuploader这样的库,它现在是免费的,并在django方面有一个很好的例子(签名库的URL直接上传到S3的代码)。图书馆有很多很好的功能,包括将文件分成小部分。我已经使用它来成功加载非常大的视频文件(16GB +)。
(道歉,如果这不是一个直接的答案,OP,但可能使答案不那么重要)
谢谢。这个库看起来非常有用。 – Rob
我注意到boto3库中有预先签订的POST数据写入到水桶的选项:HTTP: //boto3.readthedocs.io/en/latest/guide/s3.html#generating-presigned-posts ...看起来你也可以设置条件,比如“content-length-range”。 – Rob
@Rob,这是构建一个政策文件(就像你在问题中提到的,我在答案中提到的那样)以及表单字段。有关支持此服务的底层服务的低级别接口的示例在此处进行了介绍(http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html)。 –