2017-01-10 61 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-TypeおよびContent-DispositionおよびContent-Encodingは有効ですが、ほとんどのものは有効ではありません。

this support forum postは、このようなヘッダーがアップロードに追加されているかどうかを示します(S3 APIを使用して直接処理する場合)。単純に無視されます。それらは保存されず、応答とともに返されません。

知られていますが、文書化されていない例外の1つはX-Robots-Tagです。これを受け入れるとS3が応答を返しますが、APIを使用してAWSコンソールを追加することはできません。

すぐに利用できる回避策の1つは、LambdaとCloudFrontの統合であり、Lambda機能がCloudFrontネットワーク内で実行され、CloudFrontとCloudFrontの要求と応答のヘッダーを変更することができますもちろん、CloudFrontはS3と完全に統合されているので、Lambda @ Edgeが一般に利用可能になると、これは実行可能なオプションになる可能性があります。

私は(私はエッジ@ラムダのプレビューにサインアップした。私は正式に私がアクセスを許可されていたことが戻って聞いていないが、それは動作しているようだ。)これをテストし

このラムダ関数コードを使用します:それは実行可能な回避策のようですので

'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:/

をこの応答を提供します。

私はこの機能を "Viewer Response"(トリガーがCloudFrontからブラウザに返される前にレスポンスを変更できるようにするために起動します)でトリガするように設定しましたが、実際には "Origin Response"上記の例とは異なり、私がテストで行ったように、Cache-Control: no-cacheも使用していなかったと仮定して、私は/robots.txtを使用しました。これはCloudFrontとLambda - 明らかに、このファイルはX-Content-Type-Optionsにとって特に興味深いアプリケーションではありませんが、ご覧のとおり、これはうまくいきます。

Lambda @ Edgeがいつプレビューから解放されるのか分かりません。

これをS3の機能要求として送信する場合は、AWSアカウントの担当者に問い合わせるか、AWSサポートフォーラムに投稿してください。 (私はAWSと提携していません)。

+0

地獄...彼らは彼らの計画を頼むためにAmazonに連絡します。ありがとう! – MathKimRobin

+0

ありがとう、私は彼らが計画を変更することを願っています。今のところ...他の選択肢はありません:■もう一度ありがとう! – MathKimRobin

関連する問題