2009-01-28 87 views
30

我有一個ASP.NET MVC窗體可能(通常會)提交一個響應,該響應會觸發「從客戶端檢測到潛在危險的Request.Form值」錯誤。頁面的ValidateRequest設置是否可以被覆蓋?

爲了解決這個問題,我在頁面指令中放置了一個ValidateRequest =「false」。

唯一的問題:我仍然得到錯誤!現在

,直到我今天早上更新到ASP.NET MVC RC,和(據自述)都好,放置在web.config中意見如下:

<pages validateRequest="false" 
     pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" 
     pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" 
     userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> 
    <controls> 
     <add assembly="System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" /> 
    </controls> 
</pages> 

所以,validateRequest對所有頁面都應該是false,對嗎?我錯過了什麼?

+0

視圖web.config僅適用於直接瀏覽視圖文件夾,對吧? – bzlm 2009-03-01 18:53:31

+0

是的,這是正確的。 – 2009-03-04 23:31:06

回答

62

在MVC中,驗證發生在控制器級別,而不是頁面級別。要明白這是爲什麼,請考慮在控制器操作執行時,我們不知道將選擇哪個視圖進行呈現。 (實際上,控制器操作甚至可能根本不會顯示視圖!它可能會在客戶端上打開文件下載提示。)另外,如果用戶向服務器提交惡意輸入,則在呈現視圖時,來不及做任何事情。控制器已經將危險的輸入提交給數據庫。

請改爲使用屬性[ValidateInput(false)]來修飾控制器或動作。這會導致我們取消該控制器或操作的請求驗證。

+0

這幫了很大忙。 – 2009-06-09 21:05:31

2

我們有一個基本的控制器,我們的控制器繼承,這使得我們在全球範圍內禁止內在ASP.NET請求驗證:

protected override void Initialize(RequestContext requestContext) 
    { 
     // no client input will be checked on any controllers 
     ValidateRequest = false; 
     base.Initialize(requestContext); 
    } 

只要確保你驗證來自客戶端的所有輸入

17

它`necesary裝飾控制器或動作與屬性[ValidateInput(假)],添加requestValidationMode = 「2.0」 到web.config文件: 示例:

控制器:

[ValidateInput(false)] 
    public class MensajesController : Controller 
    { 
     //or in an action 
     [ValidateInput(false)] 
     [HttpPost] 
     public ActionResult Create(FormCollection collection) 
     { 
     } 
    } 

配置文件:

<configuration> 
     <system.web> 
      <httpRuntime requestValidationMode="2.0"/> 
     </system.web> 
    </configuration> 
2

我使用ASP.NET MVC 3 .NET 4中也有類似的問題。0和Windows Azure的訪問控制服務V2,在那裏我會得到錯誤:

System.Web.HttpRequestValidationException: A potentially dangerous Request.Form value was detected from the client (wresult="<t:RequestSecurityTo..."). 

,發現比關機驗證一個更好的解決方案是實現一個自定義RequestValidator這篇文章中描述:

http://social.technet.microsoft.com/wiki/contents/articles/windows-identity-foundation-wif-a-potentially-dangerous-request-form-value-was-detected-from-the-client-wresult-quot-lt-t-requestsecurityto-quot.aspx

public class SampleRequestValidator : RequestValidator 
{ 
    protected override bool IsValidRequestString(HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex) 
    { 
     validationFailureIndex = 0; 
     if (requestValidationSource == RequestValidationSource.Form && collectionKey.Equals(WSFederationConstants.Parameters.Result, StringComparison.Ordinal)) 
     { 
      SignInResponseMessage message = WSFederationMessage.CreateFromFormPost(context.Request) as SignInResponseMessage; 
      if (message != null) 
      { 
       return true; 
      } 
     } 
     return base.IsValidRequestString(context, value, requestValidationSource, collectionKey, out validationFailureIndex); 
    } 
} 

我進一步看上去比關閉驗證的唯一原因是因爲我看到了這個工作沒有按照本教程在Windows Azure平臺培訓工具包時關閉驗證:

http://msdn.microsoft.com/en-us/WAZPlatformTrainingCourse_IntroToACSLabsV2

不管怎麼說,希望這將是使用的人,並可能會提供一個更精細的方式在未來的解決這一問題。應該注意的是,如果實現自定義的RequestValidator,那麼requestValidationMode =「2.0」不是必需的。