Esci dal testo per HTML


136

Come posso evitare il testo per l'uso di HTML in C #? voglio fare

sample="<span>blah<span>"

e avere

<span>blah<span>

vengono visualizzati come testo semplice anziché blah solo con i tag parte dell'html :(. Utilizzo di C # non ASP

c#  html  escaping 

Risposte:


185
using System.Web;

var encoded = HttpUtility.HtmlEncode(unencoded);

3
Se vuoi anche codificare caratteri Unicode in non Unicode, dai un'occhiata a questo: stackoverflow.com/questions/82008/…
Gyuri,

4
Qualcosa che non vuoi scoprire nel modo sbagliato: il metodo sopra di per sé non sfugge ai caratteri di controllo. Vedere la risposta accettata qui: stackoverflow.com/a/4501246/1543677 e utilizzare entrambi.
pkExec,

HttpUtility non esiste più (win store apps)
Tertium,

82

Inoltre, è possibile utilizzare questo se non si desidera utilizzare l' System.Webassembly:

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

Per questo articolo , la differenza tra System.Security.SecurityElement.Escape()e System.Web.HttpUtility.HtmlEncode()è che il primo codifica anche (')caratteri apostrofo .


7
Per non dire SecurityElement.Escape()escape per XML che non è esattamente HTML.
Victor Sergienko,

System.Security.SecurityElement non esiste nelle app di Windows Store
Tertium,

47

Se stai utilizzando .NET 4 o versioni successive e non desideri fare riferimento System.Web, puoi utilizzare WebUtility.HtmlEncodedaSystem

var encoded = WebUtility.HtmlEncode(unencoded);

Questo ha lo stesso effetto di HttpUtility.HtmlEncodee dovrebbe essere preferito rispetto a System.Security.SecurityElement.Escape.


Perché dovrebbe essere preferito a SecurityElement.Escape? Ci sono vulnerabilità nel secondo o il primo è solo più capace?
Travis,

7
@Travis Non ci sono nemmeno vulnerabilità, è solo che SecurityElement.Escapeopera su XML e HtmlEncodefunziona su HTML, e la codifica XML e HTML ha requisiti leggermente diversi (vedi questa risposta per i dettagli). Quindi, ad esempio, SecurityElement.Escapeè consentito l'uso &apos;, mentre HtmlEncodenon lo è.
Alex

1
@Travis Penso che la "scusa" ancora migliore sia che System.Net sia disponibile per le Librerie di classi portatili e le altre due opzioni non sono / non sembrano essere questa mattina. ; ^)
ruffin,


6

.NET 4.0 e versioni successive:

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

5

È possibile utilizzare tag html effettivi <xmp>e </xmp>generare la stringa in modo da mostrare tutti i tag tra i tag xmp.

Oppure puoi anche usarlo sul server Server.UrlEncodeo HttpUtility.HtmlEncode.


Ho reso la domanda più chiara. Non voglio che i tag facciano parte di HTML come l'utente può fare </pre> e romperlo.

Ottimo post grazie amico questo ha risolto esattamente quello che stavo cercando!
Spet

1
<xmp>è stato deprecato da tempo: stackoverflow.com/questions/8307846/... uso <pre>invece
mortb

1

Non l'ho visto qui

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

è stata l'unica cosa che ha funzionato (asp 4.0+) quando si ha a che fare con HTML come questo. Il &apos;ottiene reso come '(usando htmldecode) nella html, facendolo sicuro:

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

1

ci sono alcuni caratteri di virgolette speciali che non vengono rimossi da HtmlEncode e non verranno visualizzati correttamente in Edge o IE come "e". puoi estendere la sostituzione di questi personaggi con qualcosa come la seguente funzione.

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

Probabilmente stai offrendo contenuti utilizzando una codifica errata. IE e Edge non hanno problemi a visualizzare tali caratteri.
Bouke,

0

Per coloro che in futuro cercano un modo semplice per farlo nelle pagine Razor, utilizzare quanto segue:

In .cshtml:

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

In .cshtml.cs:

string rawHtml = Html.Raw(Html.Encode("<span>blah<span>"));
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.