クロスサイト スクリプティングの脆弱性の問題を予防する方法

文書翻訳 文書翻訳
文書番号: 252985 - 対象製品
この記事は、以前は次の ID で公開されていました: JP252985
すべて展開する | すべて折りたたむ

目次

概要

動的に生成される HTML ページで、その生成に使用される入力データが、入力または出力の途中で検証されていない場合、セキュリティ上の危険が生じる可能性があります。悪質なスクリプトが、Web ページに送られる入力の中に埋め込まれ、信頼できる発行元からのものとしてブラウザに表示される可能性があります。この問題は、クロスサイト スクリプティングのセキュリティ問題と呼ばれます。この資料では、クロスサイト スクリプティングのセキュリティ問題、その影響範囲、および予防方法について説明します。

詳細

問題

背景にある根本的な問題は、多くの Web ページで、検証されていない入力が表示されることです。入力の検証を行っていない場合、悪質なスクリプトが、その入力の中に埋め込まれている可能性があります。そのため、この未検証の入力がサーバーサイド スクリプトによって表示されると、そのスクリプトは信頼できるサイトで生成されたものであるかのようにブラウザ上で実行されます。

影響範囲

動的な Web ページへの入力が検証されていない場合、以下の問題が発生する可能性があります。
  • データの整合性が保証できなくなります。
  • Cookie の設定や読み取りが行われる可能性があります。
  • ユーザー入力が盗み見られる可能性があります。
  • 悪質なスクリプトが、信頼できる発行元からのものとしてクライアントで実行される可能性があります。
この問題について、危険性のある Web ページについて説明します。基本的に、この問題の影響があるのは、未検証の入力に基づいて動的にページが生成される場合です。典型的な例として、次のような Web ページが挙げられます。
  • ユーザー入力に基づいて結果ページを返す検索エンジン
  • ユーザー アカウントをデータベース、Cookie などに保存し、そのユーザー名を後でクライアントに表示するログイン ページ
  • クレジット カードの情報を処理する Web フォーム

予防方法

ここでは、クロスサイト スクリプティングのセキュリティ攻撃を防ぐための方法をいくつか示します。ユーザー固有の状況を評価したうえで、どの手法が最も効果的に機能するかを判断してください。すべての手法で、入力から受け取るデータを検証し、信頼されるスクリプトは検証していない点に注意してください。基本的に、この問題を予防するには、コーディングに関する推奨事項に従って、ルーチンへの入力の正当性チェックを実行します。

クロスサイト スクリプティングのセキュリティ攻撃を防ぐための一般的な方法は、次のとおりです。
  • 入力パラメータに基づいて出力をエンコードします。
  • 入力の特殊文字をフィルタリングします。
  • 入力パラメータに基づいて、出力の特殊文字をフィルタリングします。
フィルタリングやエンコーディングを行う際、フィルタによって該当する特殊文字が確実にチェックされるようにするため、Web ページの文字セットを指定する必要があります。Web ページに挿入されるデータは、特定の文字セットに基づいて特殊文字と見なされるバイト シーケンスをフィルタリングして取り出します。一般的な文字セットは ISO 8859-1 で、HTML と HTTP の初期のバージョンでは、これがデフォルトの文字セットでした。これらのパラメータを変更する場合は、ローカライズに関する問題を考慮に入れる必要があります。

入力パラメータに基づいて出力の特殊文字をエンコードする

入力として受け取ったデータを HTML として書き出す前にエンコードします。この手法は、何らかの理由で入力時に検証されなかったデータに対して有効です。URLEncode や HTMLEncode などの手法を使用することで、悪質なスクリプトの実行を防ぐことができます。

次のコード (抜粋) は、Active Server Pages (ASP) ページから URLEncode と HTMLEncode を使用する方法を示しています。
<%
      var BaseURL = http://www.mysite.com/search2.asp?searchagain=;
      Response.write("<a href=\"" + BaseUrl +
      Server.URLEncode(Request.QueryString("SearchString")) +
      "\">click-me</a>");
%>
<% Response.Write("Hello visitor <I>" +
      Server.HTMLEncode(Request.Form("UserName")) +
      "</I>");
%>
				
HTML や URL をエンコードする場合、データのフィルタリングを行うのであれば、使用するコード ページを指定する必要があります。

表示される直前の文字列に対して HTMLEncode を実行することで、その中のスクリプトが一切実行されなくなり、それによって問題が予防されるという点に注意してください。

入力の特殊文字をフィルタリングする

入力から一部またはすべての特殊文字を削除して、入力のフィルタリングを行います。特殊文字とは、HTML ストリームの中でスクリプトを生成できるようにする文字です。特殊文字としては、次のようなものがあります。
< > " ' % ; ) ( & + -
				
個々の状況によっては、特殊文字以外のさらに別の文字または文字列もフィルタリングが必要な場合があることに注意してください。

フィルタリングは有効な手法ですが、いくつか注意しなければならない点があります。
  • 入力によっては、フィルタリングが適切ではない場合があります。たとえば、HTML フォームから <TEXT> という入力を受け取る場合は、代わりにエンコーディング (以下を参照してください) などの手法を選択することができます。
  • フィルタリングされる文字が、実際にはサーバーサイド スクリプトに必要な入力の場合があります。
次のコードは、JavaScript で記述された、特殊文字を削除する方法を示すサンプル フィルタです。
function RemoveBad(strTemp) { 
    strTemp = strTemp.replace(/\<|\>|\"|\'|\%|\;|\(|\)|\&|\+|\-/g,""); 
    return strTemp;
} 
				
次のコードは、ユーザー入力を処理してから、後で使用するために保管します。
<% Session("StoredPreference") = RemoveBad(Request.Cookies("UserColor"));
         var TempStr = RemoveBad(Request.QueryString("UserName"));				

入力パラメータに基づいて、出力の特殊文字をフィルタリングする

この手法は、クライアントに向けて書き出される文字をフィルタリングしている点を除けば、入力のフィルタリングに似ています。これが有効な手法となる場面もありますが、HTML 要素を書き出す Web ページでは問題が発生する可能性があります。

たとえば、<TABLE> という要素を書き出すページの場合、特殊文字を削除する汎用の関数を使用すると、< と > の文字が除去されて、<TABLE> タグが破壊されることになります。したがって、この手法を有効に使用するためには、渡されたデータか、あらかじめユーザーによって入力されてデータベースに保管されたデータだけをフィルタリングします。

悪質なデータの供給源になる可能性があるもの

この問題は、入力を使用して動的に HTML を生成する任意のページに当てはまるものですが、潜在的なセキュリティ上の危険をチェックする作業に役立てるため、悪質なデータの供給源となる可能性があるものを次にいくつか示します。
  • クエリ文字列
  • Cookies
  • 送信されるデータ
  • URL や URL の断片 (PATH_INFO など)
  • ユーザーから取得したデータで、データベースなど何らかの形態で永続保管されているもの

結論

結論として、クロスサイト スクリプティングのセキュリティ問題に関して、覚えておかなければならない重要ポイントは次のとおりです。
  • この問題は、検証されなかった入力に基づく動的なページ生成に影響を及ぼします。
  • 入力に対する正当性のチェックを怠ると、思わぬセキュリティ ホールを生む可能性があります。この問題は、入力を検証するなどの適切な開発作業標準を通じて、予防することができます。
  • サイトごと、さらにはフィールドごとに解決方法を評価したうえで、有効な手法を使用する必要があります。

関連情報

関連情報については、Carnegie Mellon University の Computer Emergency Response Team (CERT) による、次の勧告を参照してください。
http://www.cert.org/advisories/CA-2000-02.html
関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
253117 Internet Explorer および Outlook Express のクロスサイト スクリプト問題の予防策
253119 ASP コードのクロスサイト スクリプティング攻撃に対する脆弱性の有無を確認する方法
253120 Visual InterDev で生成されたコードのクロスサイト スクリプティング攻撃に対する脆弱性の有無を確認する方法
253121 [HOWTO] CSSI の脆弱性に関する MTS/ASP コードの点検

プロパティ

文書番号: 252985 - 最終更新日: 2006年4月11日 - リビジョン: 3.3
この資料は以下の製品について記述したものです。
  • Microsoft Active Server Pages 2.0
  • Microsoft Active Server Pages 3.0
  • Microsoft Windows 2000 Server
キーワード:?
kbcodesnippet kbcssi kbhowto kbsecurity KB252985
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com