2009-05-18 45 views
3

我們有一個ASP.NET web表單應用程序偶爾會產生如下所示的驗證錯誤。 這可能是什麼原因?'CombinedScript'中的ASP.NET驗證錯誤?

A validation error has occurred. 

Exception type: System.Web.HttpRequestValidationException 

Exception message: A potentially dangerous Request.QueryString value 
    was detected from the client 
    (_TSM_CombinedScripts_="...   </div>    ..."). 

Request URL: https://...:443/Default.aspx?_TSM_HiddenField_= 
    ctl00_sm1_HiddenField&_TSM_CombinedScripts_= 
    %3b%3bAjaxControlToolkit%2c+Version%3d3.5.11119.20050%2c 
    +Culture%3dneutral%2c 
    +PublicKeyToken%3d28f01b0e8%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20 
    %20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20 
    </div>%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20<div%20class= 

Stack trace: at System.Web.HttpRequest.ValidateString(String s, String valueName, String collectionName) 
    at System.Web.HttpRequest.ValidateNameValueCollection(NameValueCollection nvc, String collectionName) 
    at System.Web.HttpRequest.get_QueryString() 
    at System.Web.UI.Page.GetCollectionBasedOnMethod(Boolean dontReturnNull) 
    at System.Web.UI.Page.DeterminePostBackMode() 
    at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 
    at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 
    at System.Web.UI.Page.ProcessRequest() 
    at System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext context) 
    at System.Web.UI.Page.ProcessRequest(HttpContext context) 
    at ASP.user_default_aspx.ProcessRequest(HttpContext context) 
    at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
    at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 

更多細節:

我不認爲這是一種「惡意」的要求,但正是由於這個腳本鏈接的一些不正確的處理。如果是這樣,如何處理?

下面的腳本塊是在所討論的頁面生成的HTML源:

<script src="/Default.aspx?_TSM_HiddenField_= 
ctl00_sm1_HiddenField&_TSM_CombinedScripts_= 
%3b%3bAjaxControlToolkit%2c+Version%3d3.5.11119.20050%2c 
+Culture%3dneutral%2c 
+PublicKeyToken%3d28f01c0e84b6d53e%3aen%3a7e147239-dd05-47b0-7fb3- 
f743a139f982%3be2e86bf9%3a1aa13a87%3a8ccd9c1b%3a9ea3f0e2%3a9e7e87e9 
%3a4c9865be%3aba594826%3ac4c00916%3a630bb7c2%3af442e939" 
type="text/javascript"></script> 

回答

1

ASP.NET不允許任何HTML(基本上是一個潛在的危險值的列表)在查詢字符串或表單字段默認值。這由@Page指令的ValidateRequest屬性(默認爲true)設置。

您可以關閉該功能,但它會打開您的XSS攻擊。更好的方法是確保所有querystrings都是正確的URL編碼。

就你而言,它似乎是造成問題的</div>標記。如果這個查詢字符串是通過Javascript創建的,我會建議使用encodeURIComponent()函數來編碼值。

+0

謝謝。我猜想腳本塊是由ASP.NET框架控件或AjaxControlToolkit控件生成的。我不知道如何控制... – 2009-05-18 10:19:38