公開:

Hostヘッダとは?意味をわかりやすく簡単に解説

text: XEXEQ編集部


Hostヘッダとは

HostヘッダはHTTPリクエストにおいてクライアントがアクセスしようとしているサーバーのホスト名とポート番号を指定するためのヘッダフィールドです。HTTPの仕様であるRFC 7230で定義されており、HTTP/1.1以降で必須とされているヘッダの1つとなっています。

Hostヘッダの値はリクエスト行のURIに含まれるホスト名とポート番号と一致している必要があります。これにより、同じIPアドレスを共有する複数のWebサイトを区別することが可能となります。

また、Hostヘッダは仮想ホスティングの実現に不可欠な役割を果たしています。1台のWebサーバー上で複数のドメイン名に対応するWebサイトをホストする際、Hostヘッダの値を元にサーバーが適切なWebサイトのコンテンツを返すことができるのです。

Hostヘッダが正しく設定されていない場合、意図しないWebサイトにアクセスしてしまったり、エラーが発生したりする可能性があります。そのため、クライアント側では正しいホスト名とポート番号を指定し、サーバー側ではHostヘッダの値を適切に処理することが重要です。

セキュリティの観点からも、Hostヘッダは注目すべき点があります。Hostヘッダを偽装したリクエストを送信することで、意図しないWebサイトにアクセスさせられてしまう脆弱性が存在する場合があるためです。

Hostヘッダの構文と使用例

Hostヘッダに関して、以下3つを簡単に解説していきます。

  • Hostヘッダの基本的な構文
  • Hostヘッダを使用したHTTPリクエストの例
  • Hostヘッダとポート番号の指定方法

Hostヘッダの基本的な構文

Hostヘッダの基本的な構文は以下のようになります。

Host: ホスト名[:ポート番号]

ホスト名にはアクセスするサーバーのドメイン名やIPアドレスを指定します。ポート番号はオプションであり、指定しない場合はデフォルトのポート番号(HTTPの場合は80、HTTPSの場合は443)が使用されます。

例えば、www.example.comというWebサイトにアクセスする場合、Hostヘッダは以下のようになります。

Host: www.example.com

Hostヘッダを使用したHTTPリクエストの例

Hostヘッダを使用したHTTPリクエストの例を以下に示します。

GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0
Accept-Language: ja,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive

この例ではwww.example.comのWebサーバーに対して/index.htmlを要求しています。Hostヘッダにより、リクエストが意図したWebサーバーに確実に届けられます。

また、HTTPSを使用する場合も同様に、Hostヘッダを指定する必要があります。

GET /secure/login.php HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0
Accept-Language: ja,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1

Hostヘッダとポート番号の指定方法

デフォルト以外のポート番号を使用している場合、Hostヘッダにポート番号を指定する必要があります。以下はポート番号を指定したHostヘッダの例です。

Host: www.example.com:8080

この例ではwww.example.comの8080番ポートにアクセスしようとしていることを示しています。サーバー側ではHostヘッダに指定されたポート番号を元に、適切なWebサイトのコンテンツを返す必要があります。

なお、RFC 7230ではHostヘッダに指定するポート番号はリクエスト行のURIに含まれるポート番号と一致している必要があると定められています。つまり、以下のようなリクエストは不正な形式となります。

GET http://www.example.com:8080/ HTTP/1.1
Host: www.example.com

Hostヘッダとセキュリティ

Hostヘッダに関して、以下3つを簡単に解説していきます。

  • Hostヘッダの偽装とHTTPホスト・ヘッダー攻撃
  • Hostヘッダインジェクション脆弱性
  • Hostヘッダを使用した安全なWebサーバーの設定

Hostヘッダの偽装とHTTPホスト・ヘッダー攻撃

悪意のある攻撃者がHostヘッダを偽装し、本来アクセスするべきでないWebサイトにアクセスさせようとする攻撃手法があります。これはHTTPホスト・ヘッダー攻撃と呼ばれ、脆弱なWebサーバーに対して行われます。

例えば、攻撃者が以下のようなリクエストを送信したとします。

GET / HTTP/1.1
Host: www.attacker.com

脆弱なWebサーバーが、Hostヘッダの値を適切にチェックしていない場合、攻撃者が意図したWebサイト(この例ではwww.attacker.com)のコンテンツを返してしまう可能性があります。

Hostヘッダインジェクション脆弱性

Hostヘッダインジェクション脆弱性は攻撃者がHostヘッダに任意の値を注入できてしまう脆弱性です。この脆弱性が存在する場合、攻撃者はHostヘッダを manipulate することで、本来アクセスできないはずの内部サーバーにアクセスできてしまう可能性があります。

例えば、脆弱なWebアプリケーションが、以下のようにHostヘッダの値をログに記録しているとします。

logger.info("Accessed from: " + request.getHeader("Host"));

この場合、攻撃者は改行文字を含むHostヘッダを送信することで、ログに任意の値を注入できてしまいます。

GET / HTTP/1.1
Host: www.example.com
X-Injection: injected_value

Hostヘッダを使用した安全なWebサーバーの設定

Hostヘッダに関連する攻撃を防ぐためにはWebサーバーを適切に設定する必要があります。以下に、いくつかの対策例を示します。

  • Hostヘッダの値を厳密にチェックし、想定外のホスト名やポート番号が指定された場合はエラーを返す。
  • Hostヘッダに指定された値を、そのままログ出力やエラーメッセージに使用しない。
  • 仮想ホストの設定を見直し、意図しないホスト名でのアクセスを許可しない。

また、Webアプリケーションの実装においても、Hostヘッダの値を適切に検証し、必要な箇所でエスケープ処理を行うことが重要です。フレームワークなどを使用している場合は付属のセキュリティ機能を活用するとよいでしょう。

Hostヘッダに関する脆弱性は比較的発見されにくい場合があります。定期的なセキュリティ診断や脆弱性スキャンを行い、早期に脆弱性を発見・修正することが求められます。

Hostヘッダに関連するその他のトピック

Hostヘッダに関して、以下3つを簡単に解説していきます。

  • Hostヘッダと絶対URLの使い分け
  • Hostヘッダとクッキーの関係
  • Hostヘッダに関連するHTTPステータスコード

Hostヘッダと絶対URLの使い分け

HTTPリクエストを送信する際、リクエストラインにはHostヘッダで指定したホスト名やポート番号と一致するURIを指定する必要があります。これを絶対URLと呼びます。一方、ホスト名を省略し、パス部分のみを指定したURIを相対URLと呼びます。

一般的には絶対URLを使用することが推奨されています。絶対URLを使用することで、プロキシサーバーを経由する場合などでも、確実に意図したサーバーにリクエストを送信できます。相対URLを使用する場合はベースURLが明確でない場合に予期しない動作を引き起こす可能性があります。

ただし、同一オリジン内のリソースを参照する場合など、相対URLを使用することで URIを簡潔に記述できるメリットもあります。状況に応じて、絶対URLと相対URLを適切に使い分ける必要があるでしょう。

Hostヘッダとクッキーの関係

Hostヘッダはクッキーのドメイン属性と密接な関係があります。ドメイン属性はクッキーを送信する対象のドメインを指定するために使用されます。

ブラウザはリクエストを送信する際、Hostヘッダの値とクッキーのドメイン属性を比較し、一致する場合にのみクッキーを送信します。これにより、異なるドメインに属するWebサイト間でクッキーが送信されることを防いでいます。

ただし、ドメイン属性が広範囲に設定されている場合、意図しないドメインにクッキーが送信されてしまう可能性があります。クッキーを使用する場合は適切にドメイン属性を設定し、必要最小限の範囲に限定することが重要です。

Hostヘッダに関連するHTTPステータスコード

Hostヘッダに関連するHTTPステータスコードとして、以下の2つが挙げられます。

  • 400 Bad Request:リクエストが不正な形式である場合に返されるステータスコードです。Hostヘッダが指定されていない場合や、不正な形式のHostヘッダが指定された場合に返されることがあります。
  • 421 Misdirected Request:RFC 7540で定義されたステータスコードで、リクエストが意図したサーバーに届いていない場合に返されます。HTTP/2においてHostヘッダとリクエスト行のauthorityフィールドが一致しない場合などに使用されます。

Webサーバーはこれらのステータスコードを適切に返すことで、クライアントにリクエストの問題を通知する必要があります。また、クライアント側でも、これらのステータスコードを適切に処理することが求められます。

Hostヘッダは一見シンプルなヘッダフィールドですが、その役割は非常に重要です。Hostヘッダを適切に使用し、関連する脆弱性に対処することで、より安全で信頼性の高いWebシステムを構築することができるでしょう。

※上記コンテンツはAIで確認しておりますが、間違い等ある場合はコメントよりご連絡いただけますと幸いです。

「インターネット」に関するコラム一覧「インターネット」に関するニュース一覧
ブログに戻る

コメントを残す

コメントは公開前に承認される必要があることにご注意ください。