AWS S3浏览器上传可防止签名劫持

时间:2014-02-06 10:16:11

标签: amazon-web-services

我关注了如何将图像直接从浏览器上传到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服务器?

1 个答案:

答案 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