Texto de escape para HTML


136

¿Cómo escapo el texto para el uso de HTML en C #? quiero hacer

sample="<span>blah<span>"

y tiene

<span>blah<span>

aparecer como texto sin formato en lugar de bla solo con las etiquetas que forman parte del html :(. Usar C # no ASP

c#  html  escaping 

Respuestas:


185
using System.Web;

var encoded = HttpUtility.HtmlEncode(unencoded);

3
Si también desea codificar caracteres unicode a no unicode, consulte esto: stackoverflow.com/questions/82008/…
Gyuri

44
Algo que no desea descubrir de la mala manera: el método anterior por sí solo no escapa a los caracteres de control. Vea la respuesta aceptada aquí: stackoverflow.com/a/4501246/1543677 y use ambas.
pkExec

HttpUtility ya no existe (ganar aplicaciones de la tienda)
Tertium

82

Además, puede usar esto si no desea usar el System.Webensamblaje:

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

Según este artículo , la diferencia entre System.Security.SecurityElement.Escape()y System.Web.HttpUtility.HtmlEncode()es que el primero también codifica (')caracteres de apóstrofe .


77
No quiere decir SecurityElement.Escape()escapes para XML que no es exactamente HTML.
Victor Sergienko

System.Security.SecurityElement no existe en las aplicaciones de la tienda de Windows
Tertium

47

Si está utilizando .NET 4 o superior y no desea hacer referencia System.Web, puede usar WebUtility.HtmlEncodedesdeSystem

var encoded = WebUtility.HtmlEncode(unencoded);

Esto tiene el mismo efecto que HttpUtility.HtmlEncodey debería preferirse sobre System.Security.SecurityElement.Escape.


¿Por qué debería preferirse a SecurityElement.Escape? ¿Hay vulnerabilidades en este último, o el primero es más capaz?
Travis

77
@Travis No hay vulnerabilidades en ninguno de los dos, es solo que SecurityElement.Escapeopera en XML y HtmlEncodeopera en HTML, y la codificación XML y HTML tiene requisitos ligeramente diferentes (vea esta respuesta para más detalles). Entonces, por ejemplo, SecurityElement.Escapeestá permitido usar &apos;, mientras HtmlEncodeque no.
Alex

1
@Travis Creo que la "excusa" aún mejor es que System.Net está disponible para las bibliotecas de clases portátiles y las otras dos opciones no están / no parecen estar esta mañana. ; ^)
ruffin


6

.NET 4.0 y superior:

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

5

Puede usar etiquetas html reales <xmp>y </xmp>generar la cadena como se muestra para mostrar todas las etiquetas entre las etiquetas xmp.

O también puede usar en el servidor Server.UrlEncodeo HttpUtility.HtmlEncode.


Hice la pregunta más clara. No quiero que las etiquetas formen parte de html como el usuario puede hacer </pre> y romperlo.

Gran mensaje gracias hombre, esto solucionó exactamente lo que estaba buscando.
Pasa

1
<xmp>ha quedado en desuso hace mucho tiempo: stackoverflow.com/questions/8307846/… use <pre>en su lugar
mortb

1

No vi esto aquí

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

fue lo único que funcionó (asp 4.0+) al tratar con html como este. El &apos;se procesa como '(usando htmldecode) en el html, lo que hace que falle:

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

1

hay algunos caracteres de comillas especiales que HtmlEncode no elimina y no se mostrarán en Edge o IE correctamente como "y". puede reemplazar estos caracteres con algo como la siguiente función.

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

Probablemente esté sirviendo contenido usando la codificación incorrecta. IE y Edge no tienen problemas para mostrar dichos caracteres.
Bouke

0

Para aquellos en el futuro que buscan una manera simple de hacer esto en las páginas de Razor, use lo siguiente:

En .cshtml:

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

En .cshtml.cs:

string rawHtml = Html.Raw(Html.Encode("<span>blah<span>"));
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.