Escape-Text für HTML

136

Wie entkomme ich Text für die Verwendung von HTML in C #? Ich will das tun

sample="<span>blah<span>"

und haben

<span>blah<span>

wird als einfacher Text anstelle von blah nur mit dem Tag-Teil des HTML angezeigt :(. Verwenden von C # nicht ASP


quelle

Antworten:

185
using System.Web;

var encoded = HttpUtility.HtmlEncode(unencoded);
Michael S. Scherotter
quelle
3
Wenn Sie auch Unicode-Zeichen in Nicht-Unicode codieren möchten, lesen Sie Folgendes
Gyuri
4
Etwas, das Sie nicht auf die schlechte Weise herausfinden möchten: Die obige Methode selbst entgeht keinen Steuerzeichen. Die akzeptierte Antwort finden Sie hier: stackoverflow.com/a/4501246/1543677 und verwenden Sie beide.
pkExec
HttpUtility existiert nicht mehr (Win Store Apps)
Tertium
82

Sie können dies auch verwenden, wenn Sie die System.WebAssembly nicht verwenden möchten :

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

Gemäß diesem Artikel besteht der Unterschied zwischen System.Security.SecurityElement.Escape()und System.Web.HttpUtility.HtmlEncode()darin, dass ersteres auch Apostrophzeichen codiert (').

Tereza Tomcova
quelle
7
Ganz zu schweigen von SecurityElement.Escape()Escape für XML, das nicht genau HTML ist.
Victor Sergienko
System.Security.SecurityElement existiert nicht in Windows Store-Apps
Tertium
47

Wenn Sie .NET 4 oder höher verwenden und nicht referenzieren möchten System.Web, können Sie WebUtility.HtmlEncodevon verwendenSystem

var encoded = WebUtility.HtmlEncode(unencoded);

Dies hat den gleichen Effekt wie HttpUtility.HtmlEncodeund sollte vorgezogen werden System.Security.SecurityElement.Escape.

Alex
quelle
Warum sollte es SecurityElement.Escape vorgezogen werden? Gibt es Schwachstellen in letzterem oder ist erstere nur fähiger?
Travis
7
@Travis Es gibt auch keine Schwachstellen, es SecurityElement.Escapefunktioniert nur mit XML und HtmlEncodeHTML, und für XML und HTML-Codierung gelten leicht unterschiedliche Anforderungen ( Einzelheiten finden Sie in dieser Antwort ). So SecurityElement.Escapedarf zum Beispiel verwendet werden &apos;, während dies HtmlEncodenicht der Fall ist.
Alex
1
@Travis Ich denke, die noch bessere "Entschuldigung" ist, dass System.Net für tragbare Klassenbibliotheken verfügbar ist und die anderen beiden Optionen heute Morgen nicht / nicht zu sein scheinen. ; ^)
Ruffin
6

.NET 4.0 und höher:

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

Sie können tatsächliche HTML-Tags verwenden <xmp>und </xmp>die Zeichenfolge so ausgeben, wie sie ist, um alle Tags zwischen den xmp-Tags anzuzeigen.

Oder Sie können auch auf dem Server Server.UrlEncodeoder verwenden HttpUtility.HtmlEncode.

Andrew Siemer
quelle
Ich habe die Frage klarer gemacht. Ich möchte nicht, dass die Tags Teil von HTML sind, da der Benutzer </ pre> dies tun und es brechen kann.
Toller Beitrag, danke Mann, das hat genau das behoben, wonach ich gesucht habe!
Spets
1
<xmp>wurde schon vor langer Zeit veraltet: stackoverflow.com/questions/8307846/... Verwendung <pre>statt
mortb
1

Hab das hier nicht gesehen

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

Es war das einzige, was funktionierte (asp 4.0+), wenn es um HTML wie dieses ging. Das &apos;wird 'im HTML als (unter Verwendung von HTML-Code) gerendert , was dazu führt, dass es fehlschlägt:

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

Es gibt einige spezielle Anführungszeichen, die von HtmlEncode nicht entfernt werden und in Edge oder IE nicht korrekt angezeigt werden, wie "und". Sie können diese Zeichen durch eine der folgenden Funktionen ersetzen.

private string RemoveJunkChars(string input)
{
    return HttpUtility.HtmlEncode(input.Replace("”", "\"").Replace("“", "\""));
}
Iman
quelle
Sie liefern wahrscheinlich Inhalte mit der falschen Codierung. IE und Edge haben keine Probleme beim Anzeigen solcher Zeichen.
Bouke
0

Verwenden Sie für diejenigen, die in Zukunft nach einer einfachen Möglichkeit suchen, dies auf Razor-Seiten zu tun, Folgendes:

In .cshtml:

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

In .cshtml.cs:

string rawHtml = Html.Raw(Html.Encode("<span>blah<span>"));
fordrof
quelle