Thoát văn bản cho HTML


136

Làm cách nào để thoát văn bản để sử dụng html trong C #? tôi muốn làm

sample="<span>blah<span>"

và có

<span>blah<span>

hiển thị dưới dạng văn bản thuần thay vì blah chỉ với phần thẻ của html :(. Sử dụng C # không phải là ASP

c#  html  escaping 

Câu trả lời:


185
using System.Web;

var encoded = HttpUtility.HtmlEncode(unencoded);

3
Nếu bạn cũng muốn mã hóa các ký tự unicode thành không unicode, hãy kiểm tra điều này: stackoverflow.com/questions/82008/ mẹo
Gyuri

4
Một cái gì đó mà bạn không muốn tìm ra cách xấu: Bản thân phương pháp trên không thoát khỏi các ký tự điều khiển. Xem câu trả lời được chấp nhận tại đây: stackoverflow.com/a/4501246/1543677 và sử dụng cả hai.
pkExec

HttpUtility không còn tồn tại nữa (giành được các ứng dụng trong cửa hàng)
Tertium

82

Ngoài ra, bạn có thể sử dụng điều này nếu bạn không muốn sử dụng System.Weblắp ráp:

var encoded = System.Security.SecurityElement.Escape(unencoded)

Mỗi bài viết này , sự khác biệt giữa System.Security.SecurityElement.Escape()System.Web.HttpUtility.HtmlEncode()là cựu cũng mã hóa dấu nháy đơn (')ký tự.


7
Không phải nói SecurityElement.Escape()thoát cho XML mà không chính xác là HTML.
Victor Sergienko

System.Security.SecurityEuity không tồn tại trong các ứng dụng của windows store
Tertium

47

Nếu bạn đang sử dụng .NET 4 trở lên và bạn không muốn tham khảo System.Web, bạn có thể sử dụng WebUtility.HtmlEncodetừSystem

var encoded = WebUtility.HtmlEncode(unencoded);

Điều này có tác dụng tương tự HttpUtility.HtmlEncodevà nên được ưu tiên hơn System.Security.SecurityElement.Escape.


Tại sao nó nên được ưu tiên hơn SecurityEuity.Escape? Có lỗ hổng nào ở cái sau, hay cái trước chỉ có khả năng hơn?
Travis

7
@Travis Không có lỗ hổng nào cả, chỉ là nó SecurityElement.Escapehoạt động trên XML và HtmlEncodehoạt động trên HTML, và mã hóa XML và HTML có các yêu cầu hơi khác nhau (xem câu trả lời này để biết chi tiết). Vì vậy, ví dụ, SecurityElement.Escapeđược phép sử dụng &apos;, trong khi HtmlEncodethì không.
Alex

1
@Travis Tôi nghĩ rằng "cái cớ" thậm chí còn tốt hơn là System.Net có sẵn cho Thư viện lớp di động và hai tùy chọn khác không / không có vẻ là sáng nay. ; ^)
ruffin


6

.NET 4.0 trở lên:

using System.Web.Security.AntiXss;
//...
var encoded = AntiXssEncoder.HtmlEncode("input", useNamedEntities: true);

5

Bạn có thể sử dụng các thẻ html thực tế <xmp></xmp>để xuất chuỗi như thể hiển thị tất cả các thẻ ở giữa các thẻ xmp.

Hoặc bạn cũng có thể sử dụng trên máy chủ Server.UrlEncodehoặc HttpUtility.HtmlEncode.


Tôi làm cho câu hỏi rõ ràng hơn. Tôi không muốn các thẻ là một phần của html vì người dùng có thể thực hiện </ pre> và phá vỡ nó.

Tuyệt vời bài cảm ơn người đàn ông này cố định chính xác những gì tôi đang tìm kiếm!
Spets 16/2/2015

1
<xmp>đã bị từ <pre>
chối

1

Không thấy điều này ở đây

System.Web.HttpUtility.JavaScriptStringEncode("Hello, this is Satan's Site")

đó là điều duy nhất hoạt động (asp 4.0+) khi xử lý html như thế này. Việc &apos;được kết xuất dưới dạng '(sử dụng htmldecode) trong html, khiến nó bị lỗi:

<a href="article.aspx?id=268" onclick="tabs.open('modules/xxx/id/268', 'It&apos;s Allstars'); return false;">It's Allstars</a>

1

có một số ký tự trích dẫn đặc biệt không bị xóa bởi HtmlEncode và sẽ không được hiển thị trong Edge hoặc IE một cách chính xác như Trực và Hồi. bạn có thể thay thế các ký tự này bằng một cái gì đó như chức năng dưới đây.

private string RemoveJunkChars(string input)
{
    return HttpUtility.HtmlEncode(input.Replace("”", "\"").Replace("“", "\""));
}

Bạn có thể đang phục vụ nội dung bằng cách sử dụng mã hóa sai. IE và Edge không có vấn đề gì khi hiển thị các ký tự như vậy.
Bouke

0

Đối với những người trong tương lai đang tìm kiếm một cách đơn giản để thực hiện việc này trong các trang Dao cạo, hãy sử dụng như sau:

Trong .cshtml:

@Html.Raw(Html.Encode("<span>blah<span>"))

Trong .cshtml.cs:

string rawHtml = Html.Raw(Html.Encode("<span>blah<span>"));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.