WebSurfer's Home

トップ > Blog 1   |   Login
Filter by APML

ASP.NET 4 の要求の検証

by WebSurfer 19. February 2012 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月にこのブログを立ち上げました。その後 ブログ2 を追加し、ここは ASP.NET 関係のトピックス、ブログ2はそれ以外のトピックスに分けました。

Calendar

<<  June 2020  >>
MoTuWeThFrSaSu
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

View posts in large calendar