第5章 暴露対策
コンテンツ間パラメータ対策
コンテンツ間パラメータ
Webサイトには通常、複数のWebページがある。ひとつのWebページの中には別のページのURLが埋め込まれていて、これが次々と連鎖してゆく。Webアプリケーションの場合、連鎖するURLのそれぞれには、いくつかのパラメータが伴う。呼び出されたWebプログラムはこれらのパラメータを読み込んで柔軟な情報処理を行う。
あるWebページから別のWebページに移り変わる際HTTPリクエストに添えられるパラメータを、ここでは「コンテンツ間パラメータ」と呼ぶことにする。
コンテンツ間パラメータには次の3種類がある。
- URLパラメータ(クエリストリングパラメータ)
Webプログラム呼び出しのURLの中に含まれるパラメータ。 - POSTパラメータ
Webプログラム呼び出しのHTTPリクエストのボディ部に含まれるパラメータ。フォームへの入力と送信のオペレーションによって作り出される。 - Cookie
Webサーバ側がブラウザに預けておくことのできる小さなデータ。
Cookieは、Webサーバ側が必要と認めたとき、Webページを返すHTTPレスポンスヘッダの中に含められブラウザに送られる。Cookieを受け取ると、ブラウザは一定期間それを預かり、その間ブラウザが当該Webサーバにアクセスするときには毎回このCookieの値がHTTPリクエストヘッダに含められる。すなわち、Cookieは自動でWebプログラムに向けて送りつけられるパラメータとしてふるまう。毎回自動でブラウザから送られてくる性質を利用して、CookieはWebクライアントの一意な識別やユーザのプロフィールの記憶等に利用される。
コンテンツ間パラメータに生まれる脆弱性
コンテンツ間パラメータは、第三者への漏えい・改ざん、ユーザ本人によって改ざんされうる無防備な存在である。

図17:無防備なコンテンツ間パラメータ
第三者への漏えい
(1) 平文通信による漏えい
- 平文通信(http:)を用いているためにURLパラメータ、POSTパラメータ、Cookieが第三者に傍受される
(2) 暗号通信(https:)を使用していたとしても起こり得る漏えい
- URLパラメータがキャッシュやログに残留し、そこから漏えいする
次のような箇所
- ブラウザのキャッシュ
- プロキシサーバのキャッシュ
- ファイアウォールのログ
- Webサーバのアクセスログ
- URLパラメータがReferer:ヘッダを通じて別Webサーバに傍受される
- ハイパーリンクに埋め込んだパラメータが第三者に傍受される
- フォームデータがURLパラメータで送信され、傍受されるケースもある
- <form> タグにmethod="post"属性を明示しなかった場合
- Cookieが別サーバに傍受される
- Cookie発行の際のdomain属性の値が広いドメイン範囲を指しているとき起こる
- Cookieが別アプリケーションに傍受される
- Webサーバに複数のアプリケーションが同居しており、Cookie発行の際のpath属性の値が / 等の広すぎる範囲であるとき起こる
- 平文通信が混在していてCookieが第三者に傍受される
- Webアプリケーションの中に暗号通信を使っていない部分(http:)が混在していてかつ、Cookie発行の際secure属性があたえられていないとき起こる
ユーザ本人による改ざん
- URLパラメータ、POSTパラメータ、Cookieのいずれかに含まれる個人識別に関わるパラメータを改ざんして別人になりすまし、Webアプリケーションを不正にオペレーションする
- 同じくユーザの権限に関わるパラメータを改ざんして本来許可されないコンテンツにアクセスする
- 同じくリソースの識別に関わるパラメータを改ざんして本来許可されないコンテンツにアクセスする
対策
コンテンツ間パラメータに関わる問題を回避するには次のようにWebアプリケーションを実装する。
- 対策1 パラメータ用途の限定
コンテンツ間パラメータ(URLパラメータ、POSTパラメータ、Cookie)には、第三者に傍受されては困る秘密情報を含めない。
例えば、コンテンツ間パラメータに含めることが好ましくないものに次のものがある。:- ユーザIDとパスワード
- クレジットカード番号
- 個人情報
- プライベートデータ
- サーバ内のファイル名(プログラムからのファイル流出問題が起こりうる)
- SQL文の全体または一部(SQL注入脆弱性が避けられない)
- 対策2 セッション変数の使用
コンテンツ間パラメータの受け渡しにはなるべくセッション変数を用いる。 - 対策3 <form>タグへのmethod="post"の明記
フォームデータがURLパラメータではなくPOSTパラメータで送信されるよう、<form> タグには必ず method="post" を明記する。 - 対策4 Cookie属性の厳密な指定
Cookieの属性をより厳しい条件に設定する。- domain
なるべく狭い範囲を指定する(なるべく長いドメイン名を指定する) - path
なるべく狭い範囲を指定する(なるべく長いパス・プレフィックスを指定する) - max-ageまたはexpires
指定しないか、なるべく短い有効期間を設定する - secure
暗号通信(https:)を使う場合は必ず指定する
- domain