Tekst ucieczki dla HTML


136

Jak zmienić znaczenie tekstu do użycia w języku HTML w języku C #? chcę zrobić

sample="<span>blah<span>"

i mają

<span>blah<span>

wyświetlają się jako zwykły tekst zamiast bla tylko z tagami części html :(. Używając C #, a nie ASP

c#  html  escaping 

Odpowiedzi:


185
using System.Web;

var encoded = HttpUtility.HtmlEncode(unencoded);

3
Jeśli chcesz również zakodować znaki Unicode na inne niż Unicode, sprawdź to: stackoverflow.com/questions/82008/…
Gyuri

4
Coś, czego nie chcesz się dowiedzieć w zły sposób: powyższa metoda sama w sobie nie wymyka się znakom sterującym. Zobacz zaakceptowaną odpowiedź tutaj: stackoverflow.com/a/4501246/1543677 i użyj obu.
pkExec,

HttpUtility już nie istnieje (wygraj aplikacje ze sklepu)
Tertium

82

Możesz również użyć tego, jeśli nie chcesz używać System.Webzestawu:

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

W tym artykule różnica między System.Security.SecurityElement.Escape()i System.Web.HttpUtility.HtmlEncode()polega na tym, że ten pierwszy koduje również (')znaki apostrofów .


7
Nie mówiąc o SecurityElement.Escape()ucieczkach dla XML, który nie jest dokładnie HTML.
Victor Sergienko,

System.Security.SecurityElement nie istnieje w sklepowych aplikacji
tertium

47

Jeśli używasz platformy .NET 4 lub nowszej i nie chcesz odwoływać się do niej System.Web, możesz użyć WebUtility.HtmlEncodefromSystem

var encoded = WebUtility.HtmlEncode(unencoded);

Ma to taki sam efekt, jak HttpUtility.HtmlEncodei powinno być preferowane System.Security.SecurityElement.Escape.


Dlaczego miałoby być preferowane zamiast SecurityElement.Escape? Czy w tym drugim przypadku są luki, czy też ten pierwszy jest po prostu bardziej wydajny?
Travis,

7
@Travis Nie ma też żadnych luk w zabezpieczeniach, po prostu SecurityElement.Escapedziała na XML i HtmlEncodeoperuje na HTML, a kodowanie XML i HTML ma nieco inne wymagania (szczegóły w tej odpowiedzi ). Na przykład SecurityElement.Escapemożna go używać &apos;, a HtmlEncodenie.
Alex,

1
@Travis Myślę, że jeszcze lepszą "wymówką" jest to, że System.Net jest dostępny dla przenośnych bibliotek klas, a pozostałe dwie opcje nie są / nie wydają się być dziś rano. ; ^)
ruffin


6

.NET 4.0 i nowsze:

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

5

Możesz użyć rzeczywistych tagów html <xmp>i </xmp>wyprowadzić ciąg, tak jak ma to miejsce, aby pokazać wszystkie tagi pomiędzy tagami xmp.

Lub możesz również użyć na serwerze Server.UrlEncodelub HttpUtility.HtmlEncode.


Wyjaśniłem pytanie. Nie chcę, aby tagi były częścią html, jak może to zrobić użytkownik </pre>, i przerywają go.

Świetny post dzięki człowiekowi, to naprawiło dokładnie to, czego szukałem!
Spets

1
<xmp>został wycofany dawno temu: stackoverflow.com/questions/8307846/ ... użyj <pre>zamiast tego
mortb

1

Nie widziałem tego tutaj

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

była to jedyna rzecz, która działała (asp 4.0+) w przypadku takiego kodu HTML. &apos;Zostaje wygenerowana za '(pomocą htmldecode) w HTML, powodując jego uszkodzenie:

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

1

jest kilka specjalnych znaków cudzysłowu, które nie są usuwane przez HtmlEncode i nie będą wyświetlane poprawnie w Edge lub IE, jak „i„. możesz rozszerzyć zastąpienie tych znaków funkcją podobną do poniższej.

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

Prawdopodobnie udostępniasz treści przy użyciu niewłaściwego kodowania. IE i Edge nie mają problemów z wyświetlaniem takich znaków.
Bouke

0

Dla tych, którzy w przyszłości szukają prostego sposobu na zrobienie tego na stronach Razor, użyj następującego:

W .cshtml:

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

W .cshtml.cs:

string rawHtml = Html.Raw(Html.Encode("<span>blah<span>"));
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.