はじめに
この記事は下記リンクの日本語翻訳記事です
翻訳が誤っている場合はコメントか@no1zy_secまでお知らせいただけると幸いです。
[add_header_redefinition] add_headerディレクティブによるレスポンスヘッダの再定義
残念なことに、多くの人々はディレクティブがどのように引き継がれるかを知りません。
ネストされたレベルに新しいレスポンスヘッダ追加しようとしているとき、add_headerディレクティブを誤って使用する人がよくいます。この機能はNginxのドキュメントで言及されています。
There could be several add_header directives. These directives are inherited from the previous level if and only if there are no add_header directives defined on the current level.
日本語訳:
いくつかのadd_header
ディレクティブがある可能性があります。これらのディレクティブは現在のレベルにadd_header
が無い場合のみ、以前のレベルから引き継がれます。
そのロジックは非常に単純です。ヘッダーをとあるレベル( server
セクションなど)に設定して、location
などの低いレベルに他のヘッダーを設定すると、最初のヘッダーは破棄されます。
簡単なチェック
- 設定:
server {
listen 80;
add_header X-Frame-Options "DENY" always;
location / {
return 200 "index";
}
location /new-headers {
# Add special cache control
add_header Cache-Control "no-cache, no-store, max-age=0, must-revalidate" always;
add_header Pragma "no-cache" always;
return 200 "new-headers";
}
}
-
/
にリクエストをする (X-Frame-Options
ヘッダがserverのレスポンスヘッダにあります。)
GET / HTTP/1.0
HTTP/1.1 200 OK
Server: nginx/1.10.2
Date: Mon, 09 Jan 2017 19:28:33 GMT
Content-Type: application/octet-stream
Content-Length: 5
Connection: close
X-Frame-Options: DENY
index
-
/new-headers
にリクエストをする (Cache-Control
とPragma
ヘッダはありますが、X-Frame-Options
ヘッダがありません。)
GET /new-headers HTTP/1.0
HTTP/1.1 200 OK
Server: nginx/1.10.2
Date: Mon, 09 Jan 2017 19:29:46 GMT
Content-Type: application/octet-stream
Content-Length: 11
Connection: close
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
new-headers
対策
いくつかの解決策があります。
- 重要なヘッダーを複製します。
- あるレベルで全てのヘッダーを設定する(
server
セクションがおすすめです) - ngx_headers_moreモジュールを使用する。
関連リンク
nginxの設定ミスで起こるHTTP Splitting
nginxの設定ミスで起こるSSRF
nginxの設定ミスで起こるパス トラバーサル
nginxの設定ミスで起こるMultiline response headers
nginxの設定ミスで起こるreferer/origin検証の問題
nginxの設定ミスで起こるHostヘッダフォージェリ
nginxの設定ミスで起こるリファラの検証不備