Qué caracteres se deben escapar con sus entidades HTML. Por ejemplo, &
se escapa con &
.
¿Se '
debe escapar con '
?
No tengo privilegios de comentario, o habría dejado esto como un comentario en una respuesta anterior.
NO, repito, NO escapes de un apóstrofe en HTML usando
'
Esta no es una referencia de entidad de caracteres HTML válida. Es una referencia de entidad de caracteres XML. Mientras que Firefox y Chrome, al menos, representarán lo anterior como un apóstrofe en un documento HTML, Internet Explorer no lo hará. Y sigue el estándar cuando se niega a hacerlo.
Puede escapar de un apóstrofe en HTML usando
'
Pero no creo que sea, en general, necesario.
http://fishbowl.pastiche.org/2003/07/01/the_curse_of_apos/
http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references
&apos
que ahora es válido para HTML5. Dicho esto, si tiene que admitir navegadores heredados o escribir correos electrónicos HTML para Outlook, es mejor que se apegue'
si considera necesario escapar del personaje.No estoy de acuerdo con Nate. Lo ideal es usar el menor escape posible y usar UTF-8 para expresar caracteres de forma nativa. Para hacer esto, necesita un editor que pueda manejar UTF-8, así como una declaración de juego de caracteres correcta, como:
Sin embargo, debe acostumbrarse a escapar de los caracteres que tienen un significado especial en (X) HTML, a saber:
Esto asegurará que no esté escribiendo marcas de forma accidental cuando desee escribir estos caracteres. Esto es especialmente importante para la entrada del usuario, para mantener la seguridad. Es menos obvio, pero en realidad es importante escapar
"
. Si una cadena termina en un atributo HTML (title="something"
etc.), el usuario podría finalizar el atributo e insertar su propio marcado. Imagine lo que sucede si el usuario ingresa" onclick="alert('hello');
e inserta eso entitle="..."
Si está usando PHP, puede usar la
htmlspecialchars
función para hacer esto. Otros idiomas pueden tener otras funciones similares.Actualización: estoy corregido en el problema de apos. Maldito molesto IE.
fuente
'
no lo use'
. Si, por alguna razón, utiliza comillas simples para un atributo HTMLtitle='something'
, obviamente debe escapar de las comillas simples dentro del valor del atributo.Depende de su caso de uso, pero probablemente no deberíamos usarlo
'
en un lenguaje natural en general, por lo que el problema no debería surgir a menos que tenga un código de computadora en su XML.Cuando tenemos cadenas traducidas, encontramos que algunos traductores reemplazan las comillas de cierre con las comillas rizadas Unicode, pero dejan las comillas rectas como comillas de apertura, dejándolas visualmente desequilibradas y con un aspecto poco profesional.
Los caracteres unicode
‘
y’
deberían reemplazarse'
cuando sea posible, tanto como“
y”
deberían reemplazar"
. Esto es útil porque las computadoras no reconocen la puntuación rizada como especial. (Aunque me divierte ver que Stack Overflow / Chrome considera que "don’t
es un error de ortografía, mientras que está contento con"don't
).No ayuda que tenemos las muy atractivas
'
y"
caracteres a la derecha en el teclado.fuente
Entonces, veamos si StackExchange codifica un apóstrofe usando una entidad HTML.
Aquí hay algunos ejemplos del código fuente de esta página.
(1) Título de la pregunta: codificado.
(2) respuesta de drew: No codificado.
(3) Comentario de Tom sobre la respuesta de nitro2k01: codificado.
Por lo tanto, va en ambos sentidos.
Sin embargo, el código fuente de esta página nunca usa
'
. Todas las codificaciones son de la forma'
. Esto es consistente con nitro2k01 y el consejo de drew de no usar'
.fuente
¿A dónde va esa cuerda?
Su respuesta depende del contexto:
Si está escribiendo un párrafo en HTML con estos datos, podría ser suficiente para escapar de <,> y &:
<p>{string}</p>
Sin embargo, si está escribiendo en un atributo HTML, como
<a href='/some/path/{string}'>...</a>
Entonces deberías escapar absolutamente del apóstrofe. Este puede ser un vector de ataque si un atacante lo incluye para
string
:Lo mismo ocurre con las comillas dobles. Incluso he leído que el backtick `es vulnerable, ya que también podría usarse para los atributos HTML. Si no tiene una secuencia de comandos automática de verificación de sintaxis HTML como parte de sus rutinas de implementación, suponga que cualquiera de estos tres podría usarse y se debe escapar a los atributos HTML.
En el extremo, incluso los atributos sin comillas son válidos, por lo que el carácter de espacio también necesitaría escapar. Y
!
,@
,$
,%
,(
,)
,=
,+
,{
,}
,[
, y]
, todos los cuales pueden salir de un atributo y permitir la inserción de una nueva.Lo que hago
Para escapar en JavaScript, uso JQuery's
$(element).text(string)
o$(element).attr(attrname, string)
para hacer el escape por mí. Tenga mucho cuidado con$(element).html(unsafe)
, que no escapa a su HTML!En el código del lado del servidor, tengo que evaluar cuidadosamente el riesgo para cada caso y leer la documentación cuidadosamente. Esto dependerá del idioma y las bibliotecas particulares que esté utilizando, como Rails, Django, PHP sin formato, Drupal, etc.
Bases de datos
Si está considerando detener el problema lo antes posible, incluso antes de que entre en su base de datos, sostenga a sus caballos. Escapar HTML del texto almacenado en su DB puede llevarlo a un viaje infernal. ¿Qué sucede si luego desea permitir ciertas etiquetas HTML, pero no otras, como cursiva, negrita, colores y tablas? ¿Qué pasa si te perdiste algo en tu primer pase, pero tu escapista ya escapó
&
como&
y"
como"
? ¿Los convertirá en&amp;
y&quot;
?Mi enfoque es realizar solo el escape de SQL para la base de datos, pero dejar todos los caracteres especiales HTML para su posterior procesamiento. De esta manera, puedo depurar y ajustar mis escapes HTML fácilmente. Tenga en cuenta que eso también significa que no puedo confiar en mis propias tablas SQL si tienen cadenas proporcionadas por el usuario.
Moral
¡Nunca confíe en la entrada controlada por el usuario y siempre cite sus atributos HTML!
Basado en: el escape de HTML tiene más que &, <,> y " por Ryan Grove
fuente
Si tu apóstrofe pertenece al contenido, escapa de él. Cualquier otro carácter de contenido que pueda confundirse con el código, escapa.
fuente
La forma más fácil de hacer el trabajo sin usar la entidad real es usar PHP
htmlentities()
ohtmlspecialchars()
funciones:fuente