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


źródło

Odpowiedzi:

185
using System.Web;

var encoded = HttpUtility.HtmlEncode(unencoded);
Michael S. Scherotter
źródło
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 .

Tereza Tomcova
źródło
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.

Alex
źródło
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);
Zwycięzca
źródło
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.

Andrew Siemer
źródło
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>
Contra
źródło
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("“", "\""));
}
Iman
źródło
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>"));
fordrof
źródło