2011-12-21 16 views
2

.NET 4.0では、要求の検証が段階的に強化されました!任意のコードがRequest.Formにアクセスしようとすると、フォーム内の値が検証され、HttpRequestValidationExceptionがスローされたようです。ログインページ(フォーム認証)にリダイレクトするHttpRequestValidationException

これ自体は問題ではありません。ただし、ASP.NET自体がこの状況を処理する上で私に何の恩恵も与えていないという特定のシナリオを発見したこと以外は、問題ありません。

私はHTML入力を受け付けるフォームを持っています(私はむしろそうしたいと思いますが、私はそうします)。このフォームの編集モデルにはフィールドに[AllowHtml]という属性があります。したがって、HTMLの送信は問題なく、例外をスローしません。

ただし、ユーザーが認証されていない(セッションがタイムアウトしたなど)、フォームを送信しようとすると、ASP.NETがログインページにリダイレクトしようとしている間にHttpRequestValidationExceptionがスローされます。 ASP.NETが要求がAJAX要求であるかどうかを検証するときに、フォームフィールドにアクセスしようとすると例外がスローされます。

スタックトレース:System.Web.UI.PageRequestManager.IsAsyncPostBackRequest内のコードの

[HttpRequestValidationException (0x80004005): A potentially dangerous Request.Form value was detected from the client (LongDescription="<p>Hello</p>").] 
    System.Web.HttpRequest.ValidateString(String value, String collectionKey, RequestValidationSource requestCollection) +8855748 
    System.Web.HttpRequest.ValidateNameValueCollection(NameValueCollection nvc, RequestValidationSource requestCollection) +122 
    System.Web.HttpRequest.get_Form() +150 
    System.Web.HttpRequestWrapper.get_Form() +11 
    System.Web.UI.PageRequestManager.IsAsyncPostBackRequest(HttpRequestBase request) +223 
    System.Web.Handlers.ScriptModule.HttpResponse_Redirecting(Object sender, EventArgs e) +82 
    System.Web.HttpResponse.Redirect(String url, Boolean endResponse, Boolean permanent) +394 
    System.Web.Security.FormsAuthenticationModule.OnLeave(Object source, EventArgs eventArgs) +9044409 
    System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +148 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75 

問題の行:

// DevDiv Bugs 188713: X-MicrosoftAjax header is stripped by some firewalls 
string asyncPost = request.Form[AsyncPostFormField]; 
return !String.IsNullOrEmpty(asyncPost) && (asyncPost.Trim() == "true"); 

それが正常にこのシナリオでは、ログインページにリダイレクトするために、私は希望のすべてがあります。私はまた、.NET 4.0検証を無効にしたくありません!

誰でもこの問題を解決する方法を知りましたか?

答えて

0

明らかに「< p> Hello </p>」の問題があります。

aspxのPageディレクティブにvalidateRequest = "false"を設定できますが、これはページの検証を効果的に無効にし、サーバー/ db(攻撃が容易)に有害な可能性があります。これを避けるために

、ページがサーバーに送信、または無効にページの検証(のvalidateRequest)と、それを使用する前に、ユーザー入力を処理する前に、この値のいくつかのJS URLエンコードを探して -

文字列の安全= HttpUtility.HtmlEncode (someTextbox.Text);

http://msdn.microsoft.com/en-us/library/ff647397.aspx

+0

答えてくれてありがとう、しかし、HTMLにURLエンコードを適用することは正しいことではないだろう - それは、(例えば、&URLエンコードでHTMLエンコーディングでなければならないであろう26%されているが、HTMLに&される。また、私はこれが必要になります。 HTMLを許可するすべてのフォームに適用する - ログインページにリダイレクトする1つの状況に対応する –

関連する問題