LoginSignup
9
12

More than 5 years have passed since last update.

ASP.NETのValidateRequest

Last updated at Posted at 2014-11-01

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 プロパティ

9
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
12