by WebSurfer
2012年2月19日 15:13
ユーザー入力に <script> のような文字を許可するために、web.config の pages 要素または個々のページの @ Page ディレクティブで ValidateRequest="false" に設定することがあると思います。
ASP.NET 3.5 以前の場合はそれだけで <script> のような文字入力を許可できましたが、ASP.NET 4 では、それだけでは以下の画面のように 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>