我关注了如何将图像直接从浏览器上传到AWS S3服务器的this文章。
在测试Ruby的实现时,我意识到HTML表单输入中的签名从一个请求到另一个请求仍然保持不变。
require 'base64'
require 'openssl'
require 'digest/sha1'
policy_document = 'sample policy_document'
aws_secret_key = 'sample aws_secret_key'
policy = Base64.encode64(policy_document).gsub("\n","")
signature = Base64.encode64(
OpenSSL::HMAC.digest(
OpenSSL::Digest::Digest.new('sha1'),
aws_secret_key, policy)
).gsub("\n","")
puts policy
puts signature
如果它不是唯一的,我们如何通过从终端上下载图像来阻止用户劫持我们的AWS S3服务器?
答案 0 :(得分:1)
签名相同的原因是签名的是策略文档。策略可以如您所愿详细(例如,您可以指定只能写入具有特定前缀的对象,大小范围内的对象等)如果您每次都使用相同的策略,则会获得相同的签名。
这是一个好主意,要认真考虑政策并尽可能严格地对其进行调整。例如,如果您只想要pepole上传图像,请将内容类型约束为一个简短的图像类型列表。
此处还有一些POST政策示例:http://docs.aws.amazon.com/AmazonS3/2006-03-01/dev/HTTPPOSTExamples.html
有两种方法可以限制特定签名政策的滥用行为。一种方法是为每个上传产生并签署新策略,其中的过期日期不会太远。在该日期之后,S3将拒绝具有该签名策略的POST。您还可以通过生成随机化的随机数使每个上载的签名唯一,并通过策略要求将随机数包含在元数据中。所以你的政策将包括
["x-amz-meta-uuid", "14365123651274"]
然后你会在POST中添加一个字段(这是我上面链接的页面上的第二个例子)。
--TheMultipartForm-DataBoundary
Content-Disposition: form-data; name="x-amz-meta-uuid"
14365123651274