要求検証 - スクリプト攻撃を防ぐ

ここでは、ASP.NET の要求検証機能について説明します。既定では、サーバーに送信されたエンコードされていない HTML コンテンツをアプリケーションで処理できません。 この要求検証機能は、HTML データを安全に処理するようにアプリケーションが設計されている場合に無効にすることができます。

ASP.NET 1.1 および ASP.NET 2.0 に適用されます。

要求の検証は ASP.NET 1.1 以降の機能で、エンコードされていない HTML を含むコンテンツを、サーバーが受け入れられないようにします。 この機能は、スクリプト インジェクション攻撃、つまり、クライアント スクリプト コードや HTML が知らないうちにサーバーに送信され、格納された後、他のユーザーに提供されるのを防ぐことを目的としています。 ただし、すべての入力データを適宜検証し、HTML エンコードを行うことを強くお勧めします。

たとえば、ユーザーのメール アドレスを要求し、そのメール アドレスをデータベースに格納する Web ページを作成します。 ユーザーが有効な電子メール アドレスではなく SCRIPT>alert("hello from script")</SCRIPT> を入力<した場合、そのデータが表示されるときに、コンテンツが正しくエンコードされていない場合は、このスクリプトを実行できます。 ASP.NET の要求検証機能により、この問題が発生しないようにします。

この機能が役立つ理由

多くのサイトでは、単純なスクリプトインジェクション攻撃を受け入れていることに気付いていません。 これらの攻撃の目的が HTML を表示してサイトを改ざんすることであっても、ユーザーをハッカーのサイトにリダイレクトするためにクライアント スクリプトを実行する可能性がある場合でも、スクリプトインジェクション攻撃は Web 開発者が対処する必要がある問題です。

スクリプトインジェクション攻撃は、ASP.NET、ASP、またはその他の Web 開発テクノロジを使用しているかどうかに関係なく、すべての Web 開発者の懸念事項です。

ASP.NET 要求検証機能は、開発者がそのコンテンツを許可することを決定しない限り、エンコードされていない HTML コンテンツの処理をサーバーで許可しないことで、これらの攻撃を予防的に防止します。

想定される内容: エラー ページ

次のスクリーン ショットは、コード ASP.NET サンプルを示しています。

ASP.NET コードのサンプルを示すスクリーンショット。

このコードを実行すると、テキスト ボックスにテキストを入力し、ボタンをクリックして、ラベル コントロールにテキストを表示できる単純なページが作成されます。

このコードを実行すると、テキスト ボックスにテキストを入力し、ボタンをクリックしてラベル コントロールにテキストを表示できる単純なページが表示されるスクリーンショット。

ただし、入力して送信するなどの <script>alert("hello!")</script> JavaScript では、例外が発生します。

JavaScript を入力して送信すると、例外が発生します。

エラー メッセージには、"潜在的に危険な Request.Form 値が検出されました" と表示され、発生した内容と動作の変更方法に関する詳細が説明に記載されています。 例:

要求の検証で、危険な可能性のあるクライアント入力値が検出され、要求の処理が中止されました。 この値は、クロスサイト スクリプティング攻撃など、アプリケーションのセキュリティを侵害しようとする試みを示している可能性があります。 要求の検証を無効にするには、Page ディレクティブまたは構成セクションで を設定 validateRequest=false します。 ただし、この場合は、アプリケーションですべての入力を明示的にチェックすることを強くお勧めします。

ページで要求の検証を無効にする

ページで要求の検証を無効にするには、Page ディレクティブの 属性を validateRequest に設定する false必要があります。

<%@ Page validateRequest="false" %>

注意事項

要求の検証を無効にすると、コンテンツをページに送信できます。コンテンツが適切にエンコードまたは処理されていることを確認するのは、ページ開発者の責任です。

アプリケーションの要求検証を無効にする

アプリケーションの要求検証を無効にするには、アプリケーションの Web.config ファイルを変更または作成し、セクションの validateRequest 属性を <pages /> に設定する false必要があります。

<configuration>
   <system.web>
      <pages validateRequest="false" />
   </system.web>
</configuration>

サーバー上のすべてのアプリケーションの要求検証を無効にする場合は、Machine.config ファイルにこの変更を加えることができます。

注意事項

要求の検証を無効にすると、コンテンツをアプリケーションに送信できます。コンテンツが適切にエンコードまたは処理されるようにするのは、アプリケーション開発者の責任です。

次のコードは、要求の検証をオフにするように変更されています。

次のコードが変更され、要求の検証がオフになっていることを示すスクリーンショット。

次に、次の JavaScript がテキスト ボックス <script>alert("hello!")</script> に入力された場合、結果はになります。

JavaScript がテキスト ボックスに入力されたかどうかを示すスクリーンショット。結果はボタン

この問題が発生しないようにするには、要求の検証がオフになっている状態で、コンテンツを HTML エンコードする必要があります。

コンテンツを HTML エンコードする方法

要求の検証を無効にした場合は、今後使用するために保存されるコンテンツを HTML エンコードすることをお勧めします。 HTML エンコードでは、任意の '' または '<' が> (他のいくつかのシンボルと共に) 対応する HTML エンコード表現に自動的に置き換えられます。 たとえば、'<' は '<' に置き換えられ、'>' は '>' に置き換えられます。 ブラウザーでは、これらの特別なコードを使用して、ブラウザーに '<' または '>' を表示します。

コンテンツは、API を使用して Server.HtmlEncode(string) サーバー上で簡単に HTML エンコードできます。 また、 メソッドを使用してコンテンツを簡単に HTML デコードできます。つまり、 メソッドを使用して Server.HtmlDecode(string) 標準 HTML に戻すことができます。

Server.HtmlEncode(string) API を使用して、サーバー上でコンテンツを簡単に HTML エンコードできることを示すスクリーンショット。コンテンツは、簡単に HTML デコードできます。つまり、Server.HtmlDecode(string) メソッドを使用して標準の HTML に戻すことができます。

結果:

テキスト ボックスに