WebSurfer's Home

トップ > Blog 1   |   ログイン
APMLフィルター

ASP.NET 4 の要求の検証

by WebSurfer 2012年2月19日 15:13

ユーザー入力に <script> のような文字を許可するために、web.config の pages 要素または個々のページの @ Page ディレクティブで ValidateRequest="false" に設定することがあると思います。

ASP.NET 3.5 以前の場合はそれだけで <script> のような文字入力を許可できましたが、ASP.NET 4 では、それだけでは以下の画面のように HttpRequestValidationException がスローされてしまいます。

HttpRequestValidationException がスローされた

ASP.NET 4 ではセキュリティ強化のため、デフォルトで、BeginRequest の前に検証を有効にしているそうです。その結果、aspx ページ要求のみでなく、ASP.NET のすべてのリソースの要求(例えば、クッキー、Web サービスやカスタム HTTP ハンドラによる要求、カスタム HTTP モジュールが読む HTTP 要求のコンテンツ)に対して検証が適用されるとのことです。

この検証を、従前(ASP.NET 3.5 以前)の方法にするか新しい(ASP.NET 4)方法にするかを指定するために、httpRuntime 要素に新しい属性 requestValidationMode が追加されています。

この requestValidationMode が 4.0(デフォルト)に設定されている場合は、web.config の pages 要素 (存在する場合) と個々のページの @ Page ディレクティブの要求検証設定は無視されます。

そのため、requestValidationMode を設定しないとデフォルトの 4.0 になって、たとえ @ Page ディレクティブで ValidateRequest="false" に設定してあってもそれは無視され、ユーザーが <script> のような文字を POST すると例外がスローされます。

詳しくは Microsoft のホワイトペーパー ASP.NET 4 Breaking Changes の ASP.NET Request Validation のセクションおよび MSDN ライブラリの RequestValidationMode プロパティ のページを参照してください。

従って、ASP.NET 4 でユーザー入力に <script> のような文字を許可するためには、httpRuntime 要素の requestValidationMode 属性を 2.0 に設定した上で、ValidateRequest="false" に設定しなければなりません。

通常はユーザー入力のある特定のページのみ requestValidationMode="2.0" に設定したいと思いますが、そのような場合は location 要素の path 属性にそのページを指定します。以下のような感じです。

<configuration>
  <location path="133-RequestValidationMode.aspx">
    <system.web>
      <httpRuntime requestValidationMode="2.0" />
    </system.web>
  </location>
</configuration>

Tags:

Validation

About this blog

2010年5月にこのブログを立ち上げました。主に ASP.NET Web アプリ関係の記事です。

Calendar

<<  2024年4月  >>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

View posts in large calendar