アーカイブ

第5章 3.コンテンツ間パラメータ対策

公開日:2007年6月28日

独立行政法人情報処理推進機構
セキュリティセンター

本ページの情報は2007年6月時点のものです。
記載の資料は資料公開当時のもので、現在は公開されていないものも含みます。

コンテンツ間パラメータ

Webサイトには通常、複数のWebページがある。ひとつのWebページの中には別のページのURLが埋め込まれていて、これが次々と連鎖してゆく。Webアプリケーションの場合、連鎖するURLのそれぞれには、いくつかのパラメータが伴う。呼び出されたWebプログラムはこれらのパラメータを読み込んで柔軟な情報処理を行う。

あるWebページから別のWebページに移り変わる際HTTPリクエストに添えられるパラメータを、ここでは「コンテンツ間パラメータ」と呼ぶことにする。

コンテンツ間パラメータには次の3種類がある。

  1. URLパラメータ(クエリストリングパラメータ)
    Webプログラム呼び出しのURLの中に含まれるパラメータ。
  2. POSTパラメータ
    Webプログラム呼び出しのHTTPリクエストのボディ部に含まれるパラメータ。フォームへの入力と送信のオペレーションによって作り出される。
  3. Cookie
    Webサーバ側がブラウザに預けておくことのできる小さなデータ。
    Cookieは、Webサーバ側が必要と認めたとき、Webページを返すHTTPレスポンスヘッダの中に含められブラウザに送られる。Cookieを受け取ると、ブラウザは一定期間それを預かり、その間ブラウザが当該Webサーバにアクセスするときには毎回このCookieの値がHTTPリクエストヘッダに含められる。すなわち、Cookieは自動でWebプログラムに向けて送りつけられるパラメータとしてふるまう。毎回自動でブラウザから送られてくる性質を利用して、CookieはWebクライアントの一意な識別やユーザのプロフィールの記憶等に利用される。

コンテンツ間パラメータに生まれる脆弱性

コンテンツ間パラメータは、第三者への漏えい・改ざん、ユーザ本人によって改ざんされうる無防備な存在である。

  • 図5-3: 無防備なコンテンツ間パラメータ

第三者への漏えい

(1) 平文通信による漏えい

  • 1. 平文通信(http:)を用いているためにURLパラメータ、POSTパラメータ、Cookieが第三者に傍受される

(2) 暗号通信(https:)を使用していたとしても起こり得る漏えい

  • 2. URLパラメータがキャッシュやログに残留し、そこから漏えいする
    次のような箇所
    • ブラウザのキャッシュ
    • プロキシサーバのキャッシュ
    • ファイアウォールのログ
    • Webサーバのアクセスログ
  • 3. URLパラメータがReferer:ヘッダを通じて別Webサーバに傍受される
    • ハイパーリンクに埋め込んだパラメータが第三者に傍受される
    • フォームデータがURLパラメータで送信され、傍受されるケースもある
    • <form> タグにmethod="post"属性を明示しなかった場合
  • 4. Cookieが別サーバに傍受される
    • Cookie発行の際のdomain属性の値を指定しているとき起こる
  • 5. Cookieが別アプリケーションに傍受される
    • Webサーバに複数のアプリケーションが同居しているとき起こる
  • 6. 平文通信が混在していてCookieが第三者に傍受される
    • Webアプリケーションの中に暗号通信を使っていない部分(http:)が混在していてかつ、Cookie発行の際secure属性があたえられていないとき起こる
  • 7. XSS脆弱性が存在するとCookieが第三者に傍受される
    • Webサイトの中にクロスサイト・スクリプィングの脆弱性が存在していてかつ、Cookie発行の際httponly属性があたえられていないとき起こる

ユーザ本人による改ざん

  • 8. URLパラメータ、POSTパラメータ、Cookieのいずれかに含まれる個人識別に関わるパラメータを改ざんして別人になりすまし、Webアプリケーションを不正にオペレーションする
  • 9. 同じくユーザの権限に関わるパラメータを改ざんして本来許可されないコンテンツにアクセスする
  • 10. 同じくリソースの識別に関わるパラメータを改ざんして本来許可されないコンテンツにアクセスする

対策

コンテンツ間パラメータに関わる問題を回避するには次のように Webアプリケーションを実装する。

対策 1 パラメータ用途の限定

コンテンツ間パラメータ(URLパラメータ、POSTパラメータ、Cookie)には、第三者に傍受されては困る秘密情報を含めない。

例えば、コンテンツ間パラメータに含めることが好ましくないものに次のものがある。:

  1. ユーザIDとパスワード
  2. クレジットカード番号
  3. 個人情報
  4. プライベートデータ
  5. サーバ内のファイル名(プログラムからのファイル流出問題が起こりうる)
  6. SQL文の全体または一部(SQL注入脆弱性が避けられない)

対策 2 セッション変数の使用

コンテンツ間パラメータの受け渡しにはなるべくセッション変数を用いる。

対策 3 <form>タグへのmethod="post"の明記

フォームデータがURLパラメータではなくPOSTパラメータで送信されるよう、<form> タグには必ず method="post" を明記する。

対策 4 Cookie属性の厳密な指定

Cookieの属性をより厳しい条件に設定する。

  • domain
    指定しない(Cookieを発行したサーバのみに送信)
  • max-ageまたはexpires
    指定しないか、なるべく短い有効期間を設定する
  • secure
    暗号通信(https:)を使う場合は必ず指定する
  • httponly
    原則指定する
    但し、HTMLテキスト内のスクリプトでCookieをアクセスする場合は指定しない