我想讓用戶直接從瀏覽器上傳文件到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)。 –