HTTPヘッダ

HTTPメッセージのフォーマット
HTTP(Hypertext Transfer Protocol)は、アプリケーション層で動作するプロトコルで、HTTPメッセージとして通信する。HTTPメッセージにはブラウザからサーバーに対するリクエストメッセージとサーバーからブラウザに対するレスポンスメッセージがある。
HTTPメッセージのフォーマット
リクエストメッセージ | レスポンスメッセージ |
リクエストライン (例)GET␣/XX HTTP2.0 | ステータスライン (例)HTTP2.0␣200␣OK |
メッセージヘッダ ・リクエストヘッダ ・一般ヘッダ ・エンティティヘッダ ・その他のヘッダ | メッセージヘッダ ・レスポンスヘッダ ・一般ヘッダ ・エンティティヘッダ ・その他のヘッダ |
空行 | 空行 |
メッセージボディ | メッセージボディ |
(例)令和4年度春期午後Ⅱ問1

メッセージヘッダの種類
- リクエストヘッダ/レスポンスヘッダ
リクエストメッセージ又はレスポンスメッセージを制御するヘッダをいう。複数ある場合は、改行コードで区切って複数行で記述する(HTTPヘッダインジェクション参照)。
(例)Host、Referer、User-Agent、Age、Set-Cookie、Cookie、X-Forwarded-For - 一般ヘッダ
リクエストメッセージとレスポンスメッセージの両方で使用されるヘッダをいう。
(例)Cache-Control - エンティティヘッダ
リクエストメッセージとレスポンスメッセージに含まれるメッセージボディに関連する制御情報を含むヘッダをいう。
(例)Expires
リクエストヘッダ
Host
接続先のホスト名を指定する。
Host: www.a-sha.co.jp
Referer
直前のリンク元のURLを通知する。
Referer: Http://www.b-sha.co.jp
Cookie
ブラウザに保存しているCookieをWebサーバへ転送する。セッションIDを格納し、ログイン状態にするなどの利用方法がある。
Cookie: SESSIONID=12345
Cookieには以下の属性がある。
- Secure属性
HTTPS通信に限りWebサーバにcookieを送信する。 - HttpOnly属性
JavaSpcriptなどからCookieを読み出すことを禁止する。クロスサイトスクリプティング(XSS)攻撃への対策として有効である。 - SameSite属性
Laxを指定すると、異なるドメインを経由してアクセスした場合にcookieの送信を禁止する。クロスサイトリクエストフォージェリ(CSRF)攻撃への対策として有効である。 - Expires属性
cookieの有効期限を指定する。cookieの不正利用を防止するため、長い期限を指定しないことが推奨されている。指定しない場合はブラウザ終了時にcookieを削除する。 - Domain属性
cookieを使用するドメイン名を指定する。指定しない場合はブラウザが接続したWebサーバのFQDNを設定する。 - Path属性
cookieを使用するパス名を指定する。
User-Agent
OS、ブラウザの種類、バージョンなどをWebサーバに転送する。
User-Agent: Mozilla/5.0
X-Forwarded-For
プロキシサーバなどを経由してWebサーバに接続する際に、接続元のIPアドレスを格納する。
X-Forwarded-For: クライアント側のIPアドレス, プロキシのIPアドレス
レスポンスヘッダ
Set-Cookie
Webサーバが発行したCookieをブラウザに送る。
Set-Cookie: SESSIONID=12345
Location
リダイレクト先のURLを通知する。
Location: Http://www.c-sha.co.jp
Content-Security Policy(CSP)
ブラウザがコンテンツを読み込むときの動作を規定する。
content-security-policy.default-src 'self
上記の場合、ブラウザは全てのコンテンツをブラウザの接続先と同一オリジン(同一生成元)のサーバだけから読み込む。
X-Frame-Options
フレーム内に画像を読み込む条件を指定する。
X-Frame-Options: DENY
パラメータ(上記のDENY)は以下のとおりである。
- DENY
フレーム内に表示することができない。 - SAMEORIGIN
同一オリジンの画面のみのフレーム内に表示することができる。 - ALLOW-FROM
指定したオリジンの画面のみのフレーム内に表示することができる。
Strict-Transport-Security(HSTS)
Webサーバへのリクエスト時にHTTPS接続を強制する。
Strict-Transport-Security: max-age=31536000;
max-ageパラメータでHTTPS接続を強制する期間を指定することができる。上記の場合は31,536,000秒=1年間有効となる。
一般ヘッダ
Cache-Control
ブラウザとWebサーバ間の経路中の総理に対するキャッシュ動作を通知する。
Cache-Control: max-age=31536000;
max-ageパラメータでキャッシュの有効期間を指定することができる。上記の場合は31,536,000秒=1年間有効となる。
パラメータは以下のとおりである。
- private
Webサーバが応答するコンテンツが一人の利用者のためのものであることを示す。 - no-store
Webサーバが応答するコンテンツのキャッシュへの記録を禁止することを示す。 - no-cache
キャッシュに記録されたコンテンツは、有効性の確認がとれない限り再利用してはならないことを示す。 - max-age
キャッシュの有効期限を指定する。
HTTPヘッダインジェクション
HTTPヘッダインジェクションとは
①メッセージヘッダ(HTTPヘッダ)は1回改行すると別のメッセージヘッダを設定することができる。また、②2回改行すると、空行が生じるため、以降の行はメッセージボディとして認識される。さらに、③改行後に新たなレスポンスメッセージを記述すると、複数のレスポンスに分割することができる。メッセージヘッダに改行コードを組み込み、不正に上記の事象を生じさせる攻撃をHTTPヘッダインジェクションという。
出題例:令和4年度春期午後1問1

攻撃の手順(例)
攻撃者が標的の利用者に対して、わなサイトのURLをメールで送る。
https://www.a-sha.co.jp?SESSIONID=abcd%0d%0a%0d%0a<html><body><script>(不正なスクリプト文)</script></body></html>
標的の利用者がURLをクリックすると、不正なパラメタを含むHTTPリクエストが標的サイトへ送信される。
標的サイトは、受信したパラメタをレスポンスヘッダに出力する。
HTTP/1.1 200 OK
Set Cookie SESSIONID=abcd
(空行)
<html><body><script>(不正なスクリプト文)</script></body></html>
2回改行されることで、その後の行(<html>以降)がHTTPボディとして認識され、不正なスクリプトが実行される。
対策
HTTPヘッダインジェクションの原因は、HTTPヘッダ中で改行されることにある。したがって、対策として以下の方法が考えれられる。
- 入力パラメタからレスポンスヘッダを出力せずに、改行コードの混入を防ぐヘッダAPIを利用する。
- 改行コードをエスケープ処理する。