2012-01-10 29 views
10

Tôi có trang ASP.Net MVC 3, trong đó tôi có điều khiển Html.TextAreaFor, xem mã bên dưới. Nếu tôi cố gắng để gửi trang để các http post hành động với văn bản trong dấu ngoặc nhọn như: <test>, tôi nhận được một màn hình báo lỗi vàng nói:HtmlEncode trên bài đăng cho ASP.Net MVC 3 Html.TextAreaFor

Một giá trị Request.Form nguy hiểm đã được phát hiện từ khách hàng (RequestText = "").

Tôi không hiểu tại sao tôi nhận được điều này vì tôi tìm thấy an article by Scott Guthrie có nghĩa là cú pháp mới <%: %> trong .Net 4, sẽ tự động HtmlEncode phần tử. Vì tôi đang sử dụng cú pháp <%:%> cho điều khiển Html.TextAreaFor, tôi nghĩ rằng nó sẽ tự động xử lý điều này và chuyển đổi các dấu ngoặc nhọn thành "& lt" thích hợp; và "& gt".

<% using (Html.BeginForm()) 
    { %> 
    <%: Html.ValidationSummary() %> 
    <h2>Enter a description of the support needed</h2> 
    <%: Html.TextAreaFor(m => m.RequestText, 4, 90, null) %> 
    <input type="submit" value="Submit" /> 
<% } %> 

Trả lời

18

Về cơ bản ngay bây giờ, bạn đang mã hóa các nội dung của TextAreaFor trên đầu ra. Điều này không giúp bạn trong nhỏ nhất kể từ khi bạn đang cố gắng để đối phó với đầu vào

Nếu bạn muốn gửi nội dung "nguy hiểm tiềm tàng", bạn cần phải hoặc

1) trang trí RequestText tài sản trong phạm vi ViewModel của bạn với [AllowHtml]. (Ưu tiên)

[AllowHtml] 
public string RequestText { get; set; } 

2) vô hiệu hóa validateRequest

<system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    <httpRuntime requestValidationMode="2.0" /> 
</system.web> 

Sau đó, bạn phải đảm bảo bạn một cách thích hợp vệ sinh dữ liệu đó và/hoặc mã hóa nó trong điều khiển của bạn trước khi gửi nó đến lớp Repository của bạn hoặc Cơ sở dữ liệu.

+0

Chase - Tôi không muốn sử dụng [AllowHtml], không phải là cách để mã html .net mã hóa văn bản cho tôi khi tôi đăng lại hành động của bộ điều khiển? –

+1

Bạn mã hóa nó theo cách thủ công tại bộ điều khiển. Đó là lớp dữ liệu mà bạn không muốn dữ liệu không được mã hóa bài tấn. Bạn phải xử lý điều này ở cấp độ bộ điều khiển. –

+0

Về cơ bản, HTML không thể mã hóa dữ liệu cho bạn. Bạn có thể sử dụng Javascript, nhưng đó là xấu chỉ đơn giản bởi vì họ chỉ có thể vô hiệu hóa JS. Cách duy nhất để thực hiện điều này là ở cấp độ Server chứ không phải cấp độ máy khách. –

6

Bạn có thể trang trí bất động sản RequestText của bạn trên mô hình quan điểm với AllowHtmlAttribute:

[AllowHtml] 
public string RequestText { get; set; } 

Bằng cách này bạn đang cho phép khách hàng để nộp HTML cho tài sản duy nhất này.

Theo như cú pháp <%: %> có liên quan, điều này được sử dụng để mã hóa HTML một số giá trị trước khi xuất nó vào trang. Nó được sử dụng để bảo vệ chống lại các cuộc tấn công XSS. Nó không liên quan trong trường hợp của bạn bởi vì bạn không xuất ra trang, bạn đang nhận được các ký tự HTML trong một yêu cầu.

+0

Chúng ta có cần sử dụng '@ Html.Raw (model.RequestText)' không? hoặc khuôn khổ MVC nội bộ sẽ chăm sóc trong khi hiển thị? –

+0

Nếu tôi cho phép thuộc tính AllowHtml không cho phép tồn tại trong văn bản html. Bạn có một ý tưởng? – QMaster

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