2016-12-23 54 views

回答

1

从安全角度来看,没有任何意义上的差异。

签署的网址与PUT工作,而签约政策文件与POST工作。

两者都使用签名算法是计算,是不可行的逆向工程。

两者都允许您限制可以写入/覆盖的存储桶和密钥。 POST更灵活,允许您选择允许(通过策略)目标对象键来匹配前缀而不是确切的字符串,而这不可能是您想要做的事情。

两者都有到期机制。

两者都是免疫在这个意义上的篡改,这是不可能修改的方式,允许比将要执行的期望的一个(由签名授权)以外的动作的请求。的POST上传

一个可能的次要优点是政策文件允许你指定一个有效的尺寸范围上传。 PUT要求允许任何大小或通过将Content-Length标头包括在由服务器签名的标头列表中来指定精确的大小(以字节为单位),这需要使用签名版本4.(较旧的S3区域还支持签名版本2,但略微更容易实现,但所有地区都支持V4)

决定哪一个从进程/流的角度看是很有道理的给你,明白了什么是真的引擎盖下做的,应该没有安全相关理由相互支持。

+0

我注意到boto3库中有预先签订的POST数据写入到水桶的选项:HTTP: //boto3.readthedocs.io/en/latest/guide/s3.html#generating-presigned-posts ...看起来你也可以设置条件,比如“content-length-range”。 – Rob

+0

@Rob,这是构建一个政策文件(就像你在问题中提到的,我在答案中提到的那样)以及表单字段。有关支持此服务的底层服务的低级别接口的示例在此处进行了介绍(http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html)。 –

0

不要重新发明轮子。考虑使用像fineuploader这样的库,它现在是免费的,并在django方面有一个很好的例子(签名库的URL直接上传到S3的代码)。图书馆有很多很好的功能,包括将文件分成小部分。我已经使用它来成功加载非常大的视频文件(16GB +)。

(道歉,如果这不是一个直接的答案,OP,但可能使答案不那么重要)

+0

谢谢。这个库看起来非常有用。 – Rob