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

c#  html  escaping 

Réponses:


185
using System.Web;

var encoded = HttpUtility.HtmlEncode(unencoded);

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 .


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.


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);

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.


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>

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("“", "\""));
}

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>"));
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.