2012-03-21 41 views
7

Liên quan đến điều này question Tôi chơi xung quanh với các vấn đề XSS trong dự án ASP.NET MVC của tôi và tôi nhầm lẫn với phương thức MvcHtmlSTring.ToHtmlString(). Từ documentation "Trả về một chuỗi HTML mã hóa đại diện cho đối tượng hiện tại.", Nhưng nó doesn't làm việc trong trường hợp của tôi:MvcHtmlString.ToHtmlString() không mã hóa HTML?

var mvcHtmlString = MvcHtmlString.Create("<SCRIPT/XSS SRC=\"htpp://ha.ckers.org/css.js\">").ToHtmlString(); 

    var encoded = HttpUtility.HtmlEncode("<SCRIPT/XSS SRC=\"htpp://ha.ckers.org/css.js\">"); 

Sản lượng mvcHtmlString

<SCRIPT/XSS SRC="htpp://ha.ckers.org/css.js"> 

Sản lượng mã hóa < - - đây là hành vi tôi nghi ngờ!

&lt;SCRIPT/XSS SRC=&quot;htpp://ha.ckers.org/css.js&quot;&gt; 

Tôi có bỏ lỡ điều gì đó không?

Trả lời

8

MvcHtmlString (hoặc HtmlString, hoặc bất cứ điều gì mà thực hiện IHtmlString) là dành cho chuỗi nên được hiển thị dưới dạng HTML đúng nguyên văn - ví dụ bằng cách đặt một MvcHtmlString bạn đang nói với nó rằng bạn thực sự muốn những thẻ HTML.

Sự khác biệt là khi bạn phát ra chuỗi thành trang ASP.NET sử dụng <%: .. %> (mới trong ASP.NET 4 trở lên). Trong trường hợp đó, công cụ ASP.NET sẽ tự động HtmlEncode chuỗi thường xuyên cho bạn (hoặc bất cứ điều gì không thực hiện IHtmlString) trong khi MvcHtmlString sẽ được phát ra vào trang nguyên văn/không mã hóa.

tức là tôi nghĩ tài liệu là sai. Có một số connect ticket với lỗi tương đương trong tài liệu nhà xây dựng HtmlString mà họ đã khắc phục. (Tôi nghĩ rằng tôi nộp rằng: -/có lẽ tôi đã đóng cửa như là một bản sao của người khác?) Tôi đã không nhận thấy các tài liệu MvcHtmlString là sai quá.

+0

Nếu đó chỉ là vấn đề về tài liệu, mục đích của quá trình biến đổi ToHtmlString là gì? Từ ví dụ của tôi: Không có sự khác biệt giữa việc gọi phương thức "ToHtmlString()" và phương thức "ToString()" - cả hai đều sẽ xuất ra HTML không được mã hóa không hợp lệ. –

+0

Đó là phương thức trên giao diện [IHtmlString] (http://msdn.microsoft.com/en-us/library/system.web.ihtmlstring.aspx). Nó thực sự có nghĩa là "trả lại nội dung HTML được chèn vào trang" - nghĩa là đây là những gì ASP.NET MVC 4 sẽ gọi và phát ra các kết quả mà không cần mã hóa thêm. Tôi đoán nó là để bạn có thể làm một cái gì đó khác nhau trong các lớp khác nhưng bạn phải không có sự khác biệt ở đây. – Rup

8

Tài liệu MSDN là chính xác, nhưng có lẽ hơi khó hiểu. Giao diện MvcHtmlStringIHtmlString được sử dụng để đại diện cho một chuỗi có đã được mã hóa HTML. MSDN nói:

Trả về chuỗi được mã hóa HTML đại diện cho đối tượng hiện tại.

Đối tượng bạn thông qua vào đối tượng MvcHtmlString là đã HTML mã hóa, vì vậy cả hai .ToString().ToHtmlString() chỉ trả lại đối tượng bạn thông qua vào

Xin lưu ý rằng các tài liệu MSDN làm rõ rằng:.

Phương thức ToHtmlString và ToString trả về cùng một giá trị.

Vậy tại sao có tất cả điều này? Hai lý do:

  1. Trong công cụ xem Dao cạo và trong Biểu mẫu web ASP.NET v4 một đối tượng được thực hiện dưới dạng dữ liệu thô. Các công cụ xem giả định rằng người tạo IHtmlString đã làm vệ sinh dữ liệu.
  2. IHtmlString có phương thức xâu chuỗi của riêng nó sao cho không cần triển khai giống như ToString().Trong khi ToHtmlString() phải trả về HTML, bạn có thể dễ dàng tưởng tượng rằng ToString() có thể trả về một số thông tin gỡ lỗi thân thiện với nhà phát triển.
+0

IMO đó là "Trả về một chuỗi nội dung HTML": nó không nhất thiết là một chuỗi được mã hóa HTML, và nó đề cập đến mã hóa ở đây gây hiểu nhầm cho OP. Tôi nghĩ rằng có chỗ để cải thiện ở đây - đặc biệt là "cùng một giá trị" nhận xét (mà chỉ là trên các tài liệu MvcHtmlString và không HtmlString) nên làm rõ rằng đây là giá trị được sử dụng để xây dựng các đối tượng untransformed. – Rup

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