2017-01-10 45 views
2

我在我的Amazon S3存儲桶上的靜態文件(js,css,jpg,gif,...)上遇到了設置標題「X-Content-Type-Options:nosniff」的問題。如何在Amazon S3上設置「X-Content-Type-Options:nosniff」?

當我嘗試添加它時,它對我說:「用戶定義的元數據鍵必須以x-amz-meta-開頭。」

如何做到這一點?我應該做的 「X-AMZ-元-X-Content-Type的選項

提前感謝!

回答

3

用戶定義的元數據確實必須以x-amz-meta-*但是這不會幫助你 - 他們也是返回x-amz-meta-*頭時,對象是牽強,而x-amz-meta-X-Content-Type-Options不會被瀏覽器識別。

S3對於不以x-amz-meta-*開頭的標頭提供非常有限的支持。 Content-TypeContent-DispositionContent-Encoding是有效的,但大多數不是。

由於this support forum post表明(並且測試確認)這些頭文件是否被添加到上傳文件中(當直接使用S3 API時),它們將被忽略。它們不被存儲,並且不會與響應一起返回。

一個已知但未公開的例外是X-Robots-Tag,S3確實接受並將返回響應,儘管如果使用API​​添加它,AWS控制檯將不允許您編輯它。

應該立即可用的一種可能的解決方法是[email protected],它是Lambda和CloudFront之間的集成,其中Lambda函數在CloudFront網絡中運行,並且可以修改CloudFront內外的請求和響應標頭以及當然,CloudFront與S3完美集成,所以一旦Lambda @ Edge一般可用,這可能是一個可行的選擇。

我測試了這個(我簽署了LAMBDA @ Edge的預覽。我還沒有正式收到回信說,我被授予訪問權限,但它似乎是工作。)

使用此lambda函數代碼:

'use strict'; 
exports.handler = (event, context, callback) => { 
    const response = event.Records[0].cf.response; 
    const headers = response.headers; 
    headers['X-Content-Type-Options'] = ['nosniff']; 
    callback(null, response); 
}; 

...給出了這樣的迴應......

$ curl -v http://dxxxexample.cloudfront.net/robots.txt 
* Hostname was NOT found in DNS cache 
* Trying x.x.x.x... 
* Connected to dxxxexample.cloudfront.net (x.x.x.x) port 80 (#0) 
> GET /robots.txt HTTP/1.1 
> User-Agent: curl/7.35.0 
> Host: dxxxexample.cloudfront.net 
> Accept: */* 
> 
< HTTP/1.1 200 OK 
< Content-Type: text/plain 
< Content-Length: 324 
< Connection: keep-alive 
< Date: Tue, 10 Jan 2017 20:38:33 GMT 
< Last-Modified: Tue, 10 Jan 2017 17:13:36 GMT 
< ETag: "dbe2f9a267e8ef192f0fdf0c888da01c" 
< Cache-Control: no-cache 
< Accept-Ranges: bytes 
* Server AmazonS3 is not blacklisted 
< Server: AmazonS3 
< Via: 1.1 xxxxxxxxxx.cloudfront.net (CloudFront) 
< X-Content-Type-Options: nosniff 
< X-Cache: Miss from cloudfront 
< X-Amz-Cf-Id: xxxxx 
< 
User-agent: * 
Disallow:/

...所以,這似乎是一個可行的解決方法。

我配置了此功能以觸發「查看者響應」(觸發器觸發以允許在將響應從CloudFront返回給瀏覽器之前修改響應),但實際上它可能會觸發「原始響應」,而需要它的運行頻率較低(假設,與上例不同,您並未使用Cache-Control: no-cache,就像我在測試中那樣),我僅使用/robots.txt,因爲我恰好已將此設置與CloudFront和Lambda - 顯然這個文件不是X-Content-Type-Options的特別有趣的應用程序,但正如你所看到的,這確實有效)。

我不知道Lambda @ Edge何時會從預覽版中發佈。

如果您希望將其作爲S3自身的功能請求提交,那麼可以聯繫您的AWS賬戶代表(如果有),或者在AWS支持論壇上發佈相關信息。 (我不隸屬於AWS)。

+0

地獄......會聯繫亞馬遜詢問他們是否會有他們的計劃。謝謝 ! – MathKimRobin

+0

謝謝,我希望他們會改變他們的計劃。目前......別無選擇:■再次感謝您! – MathKimRobin