今夜つける HTTPレスポンスヘッダー (セキュリティ編)
Webサーバーがレスポンスを発行する際に、HTTPレスポンスヘッダーに付けるとセキュリティレベルの向上につながるヘッダーフィールドを紹介します。
囲み内は推奨する設定の一例です。ブラウザによっては対応していないヘッダーフィールドやオプションなどもありますので、クライアントの環境によっては機能しないこともあります。
X-Frame-Options
ブラウザが frame または iframe で指定したフレーム内にページを表示することを制御するためのヘッダーフィールドです。主にクリックジャッキングという攻撃を防ぐために用いられます。
X-Frame-Options: SAMEORIGIN
- DENY フレーム内にページを表示することを禁止(同じサイト内であっても禁止です)
- SAMEORIGIN 自分自身と生成元が同じフレームの場合にページを表示することを許可(他のサイトに禁止したい場合は主にこれを使用します)
- ALLOW-FROM origin_uri 指定された生成元のみページを表示することを許可(特定のサイトのみに許可したい場合はこれを使用します)
X-Content-Type-Options
script または stylesheet で読み込むファイルの MIME タイプが正しい(許可された)ものと一致しない限りファイルを読み込みません。非HTMLをHTMLと見なすなど、コンテンツ内容の誤判定を利用した XSS などの攻撃を防ぐために用いられます。
X-Content-Type-Options: nosniff
機密情報を含むJSONには X-Content-Type-Options: nosniff をつけるべき - 葉っぱ日記
MIME タイプのセキュリティ リスクの軽減 (Windows)
X-XSS-Protection
ブラウザの XSSフィルターの機能を有効にし、XSS攻撃を防ぐために用いられます。
X-XSS-Protection: 1; mode=block
2008/7/2 - IE8 Security Part IV: The XSS Filter
IE8 XSS Filterの仕様が微妙に変更されていた。 - 葉っぱ日記
Content-Security-Policy
外部のリソースを信頼できる生成元以外から読み込めないように制限することができます。XSSやデータインジェクション攻撃を検出して軽減することがあります。(ただし、設定によっては外部リソースを読み込めないようにすることによって、現在動作しているスクリプトが動かなくなる可能性があります。)
以前は、"X-Content-Security-Policy" というヘッダーフィールド名を使っていました。
Content-Security-Policy: default-src 'self'
- default-src 'self' 同じオリジン(同じURLスキーム、ホスト、ポート番号)からはすべてのコンテンツを読み込むようにしたい場合
- default-src 'self' *.example.com 指定したドメインとすべてのサブドメインからのコンテンツを許可したい場合
X-Permitted-Cross-Domain-Policies
「crossdomain.xml 」(Flash コンテンツから別ドメインにあるファイルを読み込む際に必要になる設定を記述したポリシーファイル)をサイトのドキュメントルートに置くことができない場合などに、同様の効果を発揮することができます。
X-Permitted-Cross-Domain-Policies: master-only
- master-only マスターポリシーファイル( /crossdomain.xml)のみが許可される
Strict-Transport-Security
指定されたサイトが常に HTTPS プロトコルを使ってアクセスするようにブラウザに指示します。HTTPのサイトからHTTPSにリダイレクトするより安全に誘導する方法です。
Strict-Transport-Security: max-age=31536000; includeSubDomains
HTTP Strict Transport Security - The Chromium Projects
HTTP Strict Transport Security - Security | MDN
Access-Control-Allow-Origin など CORS 関連
XMLHttpRequestを使って、他のドメインなどからリソースを取得したいクロスドメイン通信をしたい場合に指定します。使う場合には詳しくはCORS (Cross-Origin Resource Sharing)勧告などを参考にして下さい。
Access-Control-Allow-Origin: http://www.example.com
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-TRICORDER
Access-Control-Max-Age: 1728000
上記は "http://www.example.com" からのクロスドメイン通信をしたい場合の設定で、当該リソースへの問い合わせには POST, GET, OPTIONS が実行可能なメソッド、カスタムヘッダーとして "X-TRICORDER" を付けたリクエストを送信し、プリフライトのレスポンスをキャッシュしていい時間が 1,728,00 秒だということを表しています。
HTTP access control (CORS) | MDN
X-Download-Options
ユーザーがダウンロードしたファイルを直接"開く"ことを防止したい場合に指定します。
X-Download-Options: noopen
- noopen IE8以降ではユーザーはファイルを直接開くことができず、ローカルに保存することになります。ダウンロードのダイアログから"開く"がなくなります。
IE8 Security Part V: Comprehensive Protection - IEBlog - Site Home - MSDN Blogs
Cache-Control
ディレクティブと呼ばれるコマンドを指定することで、ブラウザのキャッシング動作を指定します。
Cache-Control: no-cache, no-store, must-revalidate
- no-cache キャッシュサーバーはリソースを格納してはならない。また有効性の再確認なしではキャッシュを使用してはならない
- no-store キャッシュはリクエスト・レスポンスの一部分をローカルストレージに保存してはならない
- must-revalidate キャッシュ可能であるが、オリジンサーバーにリソースの再確認を要求する
pragma
HTTP/1.0との後方互換性のためだけに定義されているヘッダーフィールドで、本来はクライアントからのリクエストのみに使用されます。"Cache-Control: no-cache”と併記するとよいでしょう。
pragma: no-cache
- no-cache クライアントがすべての中間サーバーに対して、キャッシュされた応答を望まないことを要求する
expires
リソースの有効期限の日時を伝えます。キャッシュされることを望まない場合には、Date ヘッダーフィールドの値と同じに設定するか、"-1"と設定します。
expires: -1
content-type
エンティティボディに含まれるオブジェクトのメディアタイプを伝えます。charsetでは文字セットを指定します。正しいメディアタイプの設定と、正しい文字コードを正しい表記で設定しましょう。
content-type: text/html;charset=utf-8
HTTPレスポンスヘッダーの設定の仕方
Apache で追加する場合には、httpd.conf の中で下記のモジュールが有効になっている必要があります。
- LoadModule headers_module modules/mod_headers.so
常に表示する HTTP レスポンスヘッダーを追加するには、下記のように設定を行います。
Header set HeaderFieldName "value"
Header set X-XSS-Protection "1; mode=block”
タイトルは、拙著『今夜わかるHTTP』からですが、『HTTPの教科書』の方が新しい本です。また、セキュリティ編としてますがたぶん完結です。2に続くか…?
ご意見などお待ちしています。そのうち OWASP Japan の OWASP Night でも紹介するかも。
追記
2013/12/01 "Access-Control-Allow-Origin"などCORS関連、"X-Download-Options"を追記しました。その他説明を微修正。コメント頂いた @hasegawayosuke さん、@kinugawamasato さん、@ockeghem さん、@hirayasu さんありがとうございます。