Texte d'échappement pour HTML

136

Comment puis-je échapper du texte pour une utilisation HTML en C #? je veux faire

sample="<span>blah<span>"

et avoir

<span>blah<span>

s'affiche en texte brut au lieu de bla uniquement avec les balises faisant partie du html :(. Utilisation de C # et non d'ASP


la source

Réponses:

185
using System.Web;

var encoded = HttpUtility.HtmlEncode(unencoded);
Michael S. Scherotter
la source
3
Si vous souhaitez également encoder des caractères Unicode en non-Unicode, consultez ceci: stackoverflow.com/questions/82008/...
Gyuri
4
Quelque chose que vous ne voulez pas découvrir dans le mauvais sens: la méthode ci-dessus en elle-même n'échappe pas aux caractères de contrôle. Consultez la réponse acceptée ici: stackoverflow.com/a/4501246/1543677 et utilisez les deux.
pkExec
HttpUtility n'existe plus (applications Win Store)
Tertium
82

En outre, vous pouvez utiliser ceci si vous ne souhaitez pas utiliser l' System.Webassembly:

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

Selon cet article , la différence entre System.Security.SecurityElement.Escape()et System.Web.HttpUtility.HtmlEncode()est que le premier code également les (')caractères d' apostrophe .

Tereza Tomcova
la source
7
Pour ne pas dire SecurityElement.Escape()échappements pour XML qui n'est pas exactement HTML.
Victor Sergienko
System.Security.SecurityElement n'existe pas dans les applications Windows Store
Tertium
47

Si vous utilisez .NET 4 ou supérieur et que vous ne souhaitez pas faire référence System.Web, vous pouvez utiliser à WebUtility.HtmlEncodepartir deSystem

var encoded = WebUtility.HtmlEncode(unencoded);

Cela a le même effet HttpUtility.HtmlEncodeet doit être préféré System.Security.SecurityElement.Escape.

Alex
la source
Pourquoi devrait-il être préféré à SecurityElement.Escape? Y a-t-il des vulnérabilités dans ce dernier, ou le premier est-il simplement plus capable?
Travis
7
@Travis Il n'y a aucune vulnérabilité dans l'un ou l'autre, c'est juste que SecurityElement.Escapefonctionne sur XML et HtmlEncodefonctionne sur HTML, et les encodages XML et HTML ont des exigences légèrement différentes (voir cette réponse pour plus de détails). Ainsi, par exemple, SecurityElement.Escapeest autorisé à utiliser &apos;, alors que HtmlEncodene l'est pas.
Alex
1
@Travis Je pense que la meilleure "excuse" est que System.Net est disponible pour les bibliothèques de classes portables et que les deux autres options ne le sont pas / ne semblent pas l'être ce matin. ; ^)
ruffin
6

.NET 4.0 et supérieur:

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

Vous pouvez utiliser des balises html réelles <xmp>et </xmp>générer la chaîne telle quelle pour afficher toutes les balises entre les balises xmp.

Ou vous pouvez également utiliser sur le serveur Server.UrlEncodeou HttpUtility.HtmlEncode.

Andrew Siemer
la source
J'ai clarifié la question. Je ne veux pas que les balises fassent partie du HTML comme l'utilisateur peut le faire </pre> et le casser.
Grand message merci mec, cela a corrigé exactement ce que je cherchais!
Spets
1
<xmp>est obsolète depuis longtemps: stackoverflow.com/questions/8307846/… utiliser à la <pre>place
mortb
1

Je n'ai pas vu ça ici

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

c'était la seule chose qui fonctionnait (asp 4.0+) avec du HTML comme celui-ci. Le &apos;est rendu comme '(en utilisant htmldecode) dans le html, provoquant son échec:

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

il existe des guillemets spéciaux qui ne sont pas supprimés par HtmlEncode et qui ne seront pas affichés correctement dans Edge ou IE comme "et". vous pouvez remplacer ces caractères par quelque chose comme la fonction ci-dessous.

private string RemoveJunkChars(string input)
{
    return HttpUtility.HtmlEncode(input.Replace("”", "\"").Replace("“", "\""));
}
Iman
la source
Vous diffusez probablement du contenu en utilisant le mauvais encodage. IE et Edge n'ont aucun problème à afficher ces caractères.
Bouke le
0

Pour ceux qui recherchent à l'avenir un moyen simple de le faire dans les pages Razor, utilisez ce qui suit:

Dans .cshtml:

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

Dans .cshtml.cs:

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