Edited at

nginxの設定ミスで起こるレスポンスヘッダの出力不備

More than 1 year has passed since last update.


はじめに

この記事は下記リンクの日本語翻訳記事です

https://github.com/yandex/gixy/blob/master/docs/en/plugins/addheaderredefinition.md

翻訳が誤っている場合はコメントか@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-ControlPragmaヘッダはありますが、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の設定ミスで起こるリファラの検証不備