¿Qué caracteres se deben escapar en HTML?

Respuestas:

318

Si está insertando contenido de texto en su documento en una ubicación donde se espera contenido de texto 1 , generalmente solo necesita escapar de los mismos caracteres que lo haría en XML . Dentro de un elemento, esto solo incluye la entidad escapar del signo &y el delimitador del elemento menor que y mayor que signos < >:

& becomes &amp;
< becomes &lt;
> becomes &gt;

Dentro de los valores de los atributos también debe escapar del carácter de comillas que está utilizando:

" becomes &quot;
' becomes &#39;

En algunos casos, puede ser seguro omitir escapar de algunos de estos personajes, pero lo aliento a escapar de los cinco en todos los casos para reducir la posibilidad de cometer un error.

Si la codificación de su documento no es compatible con todos los caracteres que está utilizando, por ejemplo, si está tratando de usar emoji en un documento codificado en ASCII, también debe escapar de ellos. La mayoría de los documentos en estos días están codificados utilizando la codificación UTF-8 totalmente compatible con Unicode donde esto no será necesario.

En general, no debes escapar de espacios como &nbsp;. &nbsp;No es un espacio normal, es un espacio que no se rompe . Puede usar estos en lugar de espacios normales para evitar que se inserte un salto de línea entre dos palabras, o para insertar espacio adicional sin que se contraiga automáticamente, pero esto suele ser un caso raro. No haga esto a menos que tenga una restricción de diseño que lo requiera.


1 Por "una ubicación donde se espera contenido de texto", quiero decir dentro de un elemento o valor de atributo citado donde se aplican las reglas de análisis normales. Por ejemplo: <p>HERE</p>o <p title="HERE">...</p>. Lo que escribí anteriormente no se aplica al contenido que tiene reglas de análisis o significado especiales, como dentro de un script o etiqueta de estilo, o como un elemento o nombre de atributo. Por ejemplo: <NOT-HERE>...</NOT-HERE>, <script>NOT-HERE</script>, <style>NOT-HERE</script>, o <p NOT-HERE="...">...</p>.

En estos contextos, las reglas son más complicadas y es mucho más fácil introducir una vulnerabilidad de seguridad. Le recomiendo encarecidamente que nunca inserte contenido dinámico en ninguna de estas ubicaciones. He visto equipos de desarrolladores competentes conscientes de la seguridad que introducen vulnerabilidades al suponer que habían codificado estos valores correctamente, pero que les falta un caso extremo. Por lo general, hay una alternativa más segura, como colocar el valor dinámico en un atributo y luego manejarlo con JavaScript.

Si debe hacerlo, lea las Reglas de prevención XSS del Proyecto de seguridad de aplicaciones web abiertas para comprender algunas de las inquietudes que deberá tener en cuenta.

Jeremy Banks
fuente
2
Algunos valores de atributos HTML también pueden tener un significado especial (JS / CSS). Por lo tanto, tampoco se aplica a estos, por ejemplo: <p onclick="NOT-HERE">...</p>y <p style="NOT-HERE">...</p>.
geekley
9

Básicamente, hay tres personajes principales que siempre deben escaparse en sus archivos HTML y XML, por lo que no interactúan con el resto de las marcas, por lo que, como es de esperar, dos de ellos serán los contenedores de sintaxis, que son < >, se enumeran a continuación:

 1)  &lt; (<)
    
 2)  &gt; (>)
    
 3)  &amp; (&)

También podemos usar comillas dobles (") como" y comillas simples (') como & apos

Evite poner contenido dinámico <script>y<style> . Estas reglas no se aplican para ellos. Por ejemplo, si tiene que incluir JSON en a, reemplace <con \ x3c, el carácter U + 2028 con \ u2028 y U + 2029 con \ u2029 después de la serialización JSON).

Caracteres de escape HTML: Lista completa: http://www.theukwebdesigncompany.com/articles/entity-escape-characters.php

Por lo tanto, debe escapar <, o & cuando le sigue cualquier cosa que pueda comenzar una referencia de caracteres. Además, la regla sobre los símbolos de unión es la única regla para los atributos entre comillas, ya que las comillas coincidentes son lo único que terminará con una. Pero si no desea terminar el valor del atributo allí, evite las comillas.

Cambiar a UTF-8 significa volver a guardar su archivo: el

uso de la codificación de caracteres UTF-8 para su página significa que puede evitar la necesidad de la mayoría de los escapes y simplemente trabajar con caracteres. Sin embargo, tenga en cuenta que para cambiar la codificación de su documento, no basta con cambiar la declaración de codificación en la parte superior de la página o en el servidor. Necesita volver a guardar su documento en esa codificación. Para obtener ayuda sobre cómo hacer eso con su aplicación, lea Configuración de codificación en aplicaciones de creación web.

Personajes invisibles o ambiguos:

Una función particularmente útil para los escapes es representar personajes que son invisibles o ambiguos en la presentación.

Un ejemplo sería el carácter Unicode U + 200F MARCA DERECHA A IZQUIERDA. Este carácter se puede usar para aclarar la direccionalidad en el texto bidireccional (por ejemplo, cuando se usan las escrituras árabe o hebrea). Sin embargo, no tiene forma gráfica, por lo que es difícil ver dónde están estos caracteres en el texto, y si se pierden o se olvidan, podrían crear resultados inesperados durante la edición posterior. El uso (o su equivalente de referencia de caracteres numéricos) hace que sea muy fácil detectar estos caracteres.

Un ejemplo de un personaje ambiguo es U + 00A0 NO-BREAK SPACE. Este tipo de espacio evita el salto de línea, pero se ve como cualquier otro espacio cuando se usa como carácter. El uso deja bastante claro dónde aparecen dichos espacios en el texto.

Alireza
fuente
3

La respuesta exacta depende del contexto. En general, estos caracteres no deben estar presentes ( HTML 5.2 §3.2.4.2.5 ):

Los nodos de texto y los valores de los atributos deben constar de caracteres Unicode, no deben contener caracteres U + 0000, no deben contener caracteres Unicode permanentemente indefinidos (no caracteres) y no deben contener caracteres de control que no sean espacios. Esta especificación incluye restricciones adicionales sobre el valor exacto de los nodos de texto y los valores de los atributos según su contexto preciso.

Para los elementos en HTML, las restricciones del modelo de contenido de texto también dependen del tipo de elemento. Por ejemplo, un "<" dentro de un elemento textarea no necesita ser escapado en HTML porque textarea es un elemento de texto sin formato que se puede escapar.

Estas restricciones están dispersas en la especificación. Por ejemplo, los valores de los atributos ( §8.1.2.3 ) no deben contener un signo ambiguo y deben estar (i) vacíos, (ii) entre comillas simples (y, por lo tanto, no deben contener el carácter U + 0027 APOSTROPHE '), (iii) entre comillas dobles ( no debe contener el carácter de MARCA DE COTIZACIÓN U + 0022 "), o (iv) sin comillas, con las siguientes restricciones:

... no debe contener ningún carácter de espacio literal, ningún carácter U + 0022 MARCA DE COTIZACIÓN ("), U + 0027 caracteres APOSTROPHE ('), U + 003D caracteres de SIGNO IGUAL (=), U + 003C caracteres MENOS DE SIGNO ( <), U + 003E MAYORES DE SEÑALES (>), o U + 0060 GRAVE ACCENT caracteres (`), y no debe ser la cadena vacía.

Andrey
fuente