スクリプトによる攻略の概要
更新 : 2007 年 11 月
ブラウザから見ると、Web ページは長い一連の文字にすぎません。ブラウザは、一部の文字を表示する一方で <b> や <script> などの特定の文字を特殊な規則に従って解釈して、文字列を順番に処理します。悪意のあるユーザーがこのような特殊な文字をページに挿入した場合でも、ブラウザはその文字が本来そこに挿入されていないものとは認識せずに、その文字をページの一部として処理します。
一般的なスクリプトによる攻略を次に説明します。アプリケーションで、他のユーザーが読み取る最新の動画に関するコメントをユーザーがポストできる場合、攻略は次の手順で行われる可能性があります。
ユーザーがコメントを入力するためのフォームをアプリケーションが表示します。悪意のあるユーザーが、<script> ブロックを埋め込んだコメントを書きます。
フォームがポストされると、悪意のあるユーザーのコメントがデータベースに格納されます。
別のユーザーがこのサイトを訪れます。ページが構築されるときに、データベースからコメントが読み取られてページに送られます。悪意のあるユーザーが書いた <script> ブロックは、テキストのコメントであるかのようにページに書き込まれます。
次のユーザーのブラウザにこのページが表示されるとき、<script> ブロックが実行されます。
悪意のあるユーザーがスクリプトによる攻略を悪用する方法は他にもあります。大部分のスクリプトによる攻略は、アプリケーションに悪意のある入力の受け入れを要求し、それをページに挿入 (エコー) させ、そこでブラウザによって実行させます。このような攻略行為から受ける被害は、実行されるスクリプトによって異なります。被害の種類としては、ブラウザ内で目ざわりなメッセージがポップアップされるだけの軽微なものもあります。しかし、Cookie やユーザー入力 (たとえばパスワード) を盗み出したり、インターネット セキュリティが甘い場合にはユーザーのコンピュータ上でネイティブ コードを実行したりするなどの、深刻な被害をもたらすことがあります。
スクリプトによる攻略を防ぐ方法については、「方法 : HTML エンコーディングを文字列に適用して Web アプリケーションをスクリプトによる攻略から保護する」を参照してください。
メモ : |
---|
ASP.NET は、"<!"、"</"、"<?" などの潜在的に危険な文字列がないかチェックすることにより、URL と見せかけた、スクリプトによる攻略を防ぎます。 |
SQL ステートメント による攻略
スクリプトによる攻略の一種に、悪意のある SQL ステートメントを実行するものがあります。このような攻略は、アプリケーションがユーザーに情報の入力を求め、ユーザーから入力された情報を SQL ステートメントを表す文字列に連結する場合に実行される可能性があります。たとえば、次のようなステートメントを実行するためにアプリケーションが顧客名の入力を求める場合があります。
"Select * From Customers where CustomerName = " & txtCustomerName.Value
このとき、悪意のあるユーザーがデータベースについて知識を持っていれば、テキスト ボックスを使用して、顧客名が入力された埋め込み SQL ステートメントを入力できます。このようなステートメントの例を次に示します。
Select * From Customers Where CustomerName = 'a' Delete From Customers Where CustomerName > ''
このクエリが実行されると、データベースが危殆化されます。
スクリプトによる攻略から防御する
スクリプトによる攻略に対する基本的な防御方法は、ユーザーから入力される情報を信頼しないという姿勢です。つまり、ブラウザからアプリケーションにポストされたデータには悪意のあるスクリプトが含まれていると常に想定することです。
同様に、文字列をページに書き込むときは、文字列が悪意のあるスクリプトを含んでしまう可能性があることを常に意識してください (ただし、プログラムによって自分で文字列を作成した場合を除く)。たとえば、データベースから文字列を読み取るときは、悪意のあるスクリプトが文字列に含まれている可能性があることを想定する必要があります。セキュリティ意識の高い開発者は、悪意のあるユーザーがデータベースを改変する手段を見つける可能性があると想定し、自分たちのデータベースでさえも疑うことがあります。
ASP.NET には、スクリプトによる攻略から防御方法がいくつか用意されています。
ASP.NET は、Cookie 値と同様にクエリ文字列およびフォーム変数に対して要求の検証を実行します。既定では、現在の Request に HTML エンコード要素または特定の HTML 文字 (たとえば全角ダッシュを表す —) が含まれている場合、ASP.NET Page Framework はエラーを発生させます。
アプリケーションで文字列を表示する一方でその文字列を信用しない場合は、文字列を応答に書き戻すときに HTML エンコーディングを適用します。たとえば、エンコードを適用すると、<b> タグは <b> となります。この方法は、内容が信用できるかどうかわからないデータベースから読み取った文字列を表示する場合に使用できます。
アプリケーションで何らかの HTML (たとえば、ユーザーから入力される書式指定) を受け入れる場合は、クライアント側でその HTML をエンコードしてから、それをサーバーに送信する必要があります。詳細については、「方法 : HTML エンコーディングを文字列に適用して Web アプリケーションをスクリプトによる攻略から保護する」を参照してください。
SQL ステートメントによる攻略を防御するには、文字列の連結を使用する SQL クエリを作成しないでください。代わりにパラメータ付きのクエリを使用し、ユーザー入力をパラメータ オブジェクトに代入してください。詳細については、「データ アダプタ コマンドのパラメータ」を参照してください。
常に一連の予測値に対するフォーム入力の検証、および文字列の書式設定検証および型検証を行います。たとえば、特定のフォーム変数が整数になることが予測される場合、Int32.TryParse メソッドを使用してその値が実際に整数であることを検査し、さらに範囲チェック機能を使用してその値が受け入れ可能な範囲内にあることを確認します。
参照
処理手順
方法 : HTML エンコーディングを文字列に適用して Web アプリケーションをスクリプトによる攻略から保護する