2009-01-28 23 views
30

Tôi có một hình thức ASP.NET MVC có thể (thường là) gửi một phản ứng mà sẽ kích hoạt "Một giá trị Request.Form nguy hiểm tiềm tàng đã được phát hiện hình thức khách hàng" lỗi.Cài đặt ValidateRequest của trang có thể bị ghi đè không?

Để cố gắng giải quyết vấn đề này, tôi đã đặt ValidateRequest = "false" trong chỉ thị trang.

Chỉ có vấn đề: Tôi vẫn gặp lỗi!

Bây giờ, tất cả là tốt cho đến khi tôi cập nhật vào ASP.NET MVC RC sáng nay, và (theo readme), đặt sau đây trong Views 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> 

Vì vậy, ValidateRequest phải là sai cho tất cả các trang, phải không? Tôi đang thiếu gì?

+0

Chế độ xem web.config chỉ áp dụng khi lướt trực tiếp vào thư mục Chế độ xem, phải không? – bzlm

+0

Vâng, đó là chính xác. –

Trả lời

62

Trong MVC, xác thực diễn ra ở cấp bộ điều khiển, không phải ở cấp trang. Để xem lý do tại sao điều này là, hãy xem xét rằng tại thời điểm hành động điều khiển đang thực thi, chúng ta không biết khung nhìn nào sẽ được chọn để render. (Trong thực tế, hành động điều khiển có thể thậm chí không hiển thị một lượt xem! Nó có thể mở một lời nhắc tải xuống tệp trên máy khách thay thế.) Ngoài ra, nếu người dùng gửi đầu vào độc hại đến máy chủ, vào thời điểm hiển thị, quá muộn để làm bất cứ điều gì về nó. Bộ điều khiển đã cam kết đầu vào nguy hiểm cho cơ sở dữ liệu.

Thay vào đó, vui lòng trang trí bộ điều khiển hoặc tác vụ với thuộc tính [ValidateInput (false)]. Điều này sẽ làm cho chúng ta ngăn chặn xác nhận yêu cầu cho bộ điều khiển hoặc hành động đó.

+0

Điều này đã giúp ích rất nhiều. –

+0

Thật vậy, cảm ơn bạn! – Aaron

+0

+1 không chỉ cung cấp câu trả lời mà còn cung cấp lý do tại sao nó hoạt động như vậy. Luôn luôn tốt để biết làm thế nào để làm một cái gì đó, nhưng luôn luôn tốt hơn để biết lý do tại sao để làm một cái gì đó – JakeJ

2

Chúng tôi có một bộ điều khiển cơ sở đó điều khiển của chúng tôi kế thừa từ, cho phép chúng tôi trên toàn cầu vô hiệu hóa nội tại xác nhận ASP.NET yêu cầu:

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

Chỉ cần chắc chắn rằng bạn xác nhận tất cả đầu vào từ khách hàng!

17

It `s necesary trang trí bộ điều khiển hay hành động với thuộc tính [ValidateInput (false)] và thêm requestValidationMode = "2.0" vào file web.config: Ví dụ:

Bộ điều khiển:

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

Các tập tin cấu hình:

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

Có, requestValidationMode cần phải được thiết lập cho .NET 4. Cảm ơn bạn đã cập nhật. –

2

tôi đã có một vấn đề tương tự sử dụng ASP.NET MVC 3 với .NET 4.0 và v2 Windows Azure Service Access Control, nơi tôi sẽ nhận được lỗi:

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

và tìm thấy một giải pháp tốt hơn tắt xác nhận đã thực hiện một RequestValidator tùy chỉnh như đã mô tả trong bài viết này:

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); 
    } 
} 

lý do duy nhất tôi nhìn xa hơn tắt xác nhận được vì tôi đã nhìn thấy làm việc này mà không cần tắt xác nhận khi làm theo hướng dẫn này trong Windows Azure vBulletin Đào tạo Kit:

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

Dù sao, hy vọng điều này sẽ được sử dụng với một ai đó và có thể cung cấp một cách tiếp cận cụ thể hơn để giải quyết vấn đề này trong thời gian tới. Cần lưu ý rằng requestValidationMode = "2.0" là không cần thiết nếu bạn triển khai RequestValidator tùy chỉnh.

Các vấn đề liên quan