Nginx - ホスト ヘッダーの偽装

Nginx - ホスト ヘッダーの偽装

Djangoアプリは特定のリンクなどにホストヘッダーに依存しています。私の設定では、Djangoアプリをnginxの背後でリバースプロキシとして実行しています(デフォルト以外を使用server_name)。

によると:

https://docs.djangoproject.com/en/3.1/topics/security/#ホストヘッダー検証

たとえば、Apacheが、ServerNameが設定されたデフォルト以外の仮想ホストからDjangoサイトが提供されるように設定されている場合でも、HTTPリクエストがこの仮想ホストと一致し、偽のHostヘッダーを提供することは可能です。

nginx でそれができるかどうか、またどのようにできるかについての情報は見つかりませんでした。

nginx からのヘッダーに依存して Web アプリケーションを盲目的に許可するのは本当に安全ではないのでしょうか?

答え1

ヘッダーをリバース プロキシ アプリに渡すには、 /ブロックHost:に以下を追加します。serverlocation

proxy_set_header Host $host;

最終的にどのような値が可能になるかは、nginx 仮想ホストの構成によって異なります$host

serverブロックがブロックである場合default_server、サーバー ブロックは任意の仮想ホストに送信されたすべてのリクエストを処理することを意味します。その場合、Hostヘッダーの値は上流サーバーに伝播されます。

このシナリオでこれを防ぐにはdefault_server、次のバージョンを使用します。

proxy_set_header Host example.com;

example.comドメイン名はどこですか。

さらに良い方法は、ブロックが常に 404 を返すように nginx を適切に構成しdefault_server、正しい名前の適切な仮想ホストが使用されるようにすることです。

関連情報