2014-02-06 37 views
1

我跟着this文章介紹如何直接從瀏覽器上傳圖片到AWS S3服務器。AWS S3瀏覽器上傳防止簽名劫持

當測試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

簽名相同的原因是因爲簽名是政策文件。策略可以儘可能詳細(例如,您可以指定只能寫入具有特定前綴的對象,大小範圍內的對象等)。如果每次使用相同的策略,則會得到相同的簽名。

這是一個不錯的主意,應該認真思考這個政策,並儘可能嚴密地把握它。例如,如果您只想要人物上傳圖像,請將內容類型限制爲圖像類型的簡短列表。

這裏有POST政策的一些例子:http://docs.aws.amazon.com/AmazonS3/2006-03-01/dev/HTTPPOSTExamples.html

有一對夫婦的方式,你可以限制濫用對於給定的簽約政策的可能性。一種方法是爲每個上傳日​​期生成並簽署新策略,該策略的有效期不會太長。在此日期之後,S3將拒絕使用該已簽署的策略的POST。您還可以通過生成隨機的隨機數使簽名每次上載唯一,並通過策略要求將隨機數包括在元數據中。所以,你的政策將包括

["x-amz-meta-uuid", "14365123651274"] 

然後你就一個字段添加到您的文章(這是我剛纔的鏈接頁面上的第二個例子)。

--TheMultipartForm-DataBoundary 
Content-Disposition: form-data; name="x-amz-meta-uuid" 

14365123651274