ASP.NETでは、ValidateReuqestというセキュリティ機能が存在し、デフォルトでONになっている。
ASP.NET の組み込み機能を活用し、Web 攻撃を回避する
ASP.NET 1.1 では、@Page ディレクティブ上の ValidateRequest 属性がオンになっているなら、ユーザーが潜在的に危険な HTML マークアップを、クエリ文字列、クッキー、あるいはフォーム フィールドで送信していないか確認します。もしこれが検出されたなら、例外処置が実行されリクエストは中断されます。この属性はデフォルトではオンとなっており、保護されるためには何も変更すべきではありません。もし HTML マークアップの受け渡しを許可したいのなら、積極的にこれを無効化する必要があります。
このため、URLパラメータにタグが含まれていたりすると、
System.Web.HttpRequestValidationException (0x80004005): 危険な可能性のある Request.QueryString 値がクライアント ("...") から検出されました。
と、ASP.NET側で自動的に500エラーを返してしまう。
オフにするには、web.configで
<system.web>
<httpRuntime requestValidationMode="2.0" />
</system.web>
と指定し(Modeが4だと全ページで強制ONになる)、個別のページで@Pageディレクティブを以下のように設定する必要がある。
<@ Page validateRequest="false" %>
無効化しない状態だと、BeginRequestより前にチェックが行われて500エラーを返してしまうので、コード側では何もできない。
当然、オフにする場合は上記のセキュリティ機能の恩恵は受けられないので、パラメータの扱いには注意すること。
HTTPハンドラー(.ashx)の場合
HTTPハンドラでは、自動チェックは行われないが、該当の値にアクセスする際にチェックが行われ、NGだとHttpRequestValidationExceptionが投げられる。
URLパラメータにアクセスした際のチェック
http://referencesource.microsoft.com/#System.Web/xsp/system/Web/HttpRequest.cs#2116
チェックなしで値を取得したい場合は、値の扱いを自分で気をつけつつ、HttpRequest.Unvalidatedプロパティを使用する。
var userComment = Request.Form["userInput"]; // Validated, throws error if input includes markup
Request.Unvalidated("userInput"); // Validation bypassed
Request.Unvalidated.Form["userInput"]; // Validation bypassed
Request.QueryString["userPreference"]; // Validated
Request.Unvalidated.QueryString["userPreference"]; // Validation bypassed;
参考
Request Validation in ASP.NET
HttpRequest.Unvalidated プロパティ