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


fuente

Respuestas:

185
using System.Web;

var encoded = HttpUtility.HtmlEncode(unencoded);
Michael S. Scherotter
fuente
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 .

Tereza Tomcova
fuente
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.

Alex
fuente
¿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);
Víctor
fuente
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.

Andrew Siemer
fuente
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>
Contra
fuente
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("“", "\""));
}
Iman
fuente
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>"));
fordrof
fuente