¿Debo escapar del carácter Apostrophe (') con su entidad HTML (& # 39;)?

38

Qué caracteres se deben escapar con sus entidades HTML. Por ejemplo, &se escapa con &.

¿Se 'debe escapar con '?

Tom
fuente

Respuestas:

41

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

dibujó
fuente
Reconozco que esto habrá sido correcto cuando se publicó, sin embargo, mirar el artículo de Wikipedia parece &aposque 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.
Tomhughes
24

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:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

Sin embargo, debe acostumbrarse a escapar de los caracteres que tienen un significado especial en (X) HTML, a saber:

< &lt;
> &gt;
" &quot;
& &amp;
' &#39;

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 htmlspecialcharsfunción para hacer esto. Otros idiomas pueden tener otras funciones similares.

Actualización: estoy corregido en el problema de apos. Maldito molesto IE.

nitro2k01
fuente
Tengo dos respuestas contradictorias ahora. Uno recomienda escapar 'y el otro no. ¿Qué debería creer?
Tom
77
En breve. Puede o no escapar de él a su discreción. Si lo hace, &#39;no lo use &apos;. Si, por alguna razón, utiliza comillas simples para un atributo HTML title='something', obviamente debe escapar de las comillas simples dentro del valor del atributo.
nitro2k01
su segundo párrafo es lo que es importante para mí, mi TOC comenzó a funcionar a toda velocidad cuando vi fallas rojas de texto en mi git commit debido a los apóstrofes sin escape imgur.com/a/LN0Pu89
eballeste
6

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’tes 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.

android.weasel
fuente
1

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.

Should I escape the Apostrophe ( &#39; ) character with its HTML entity (&amp;#39;)?

(2) respuesta de drew: No codificado.

But I don't believe it is, in general, necessary.

(3) Comentario de Tom sobre la respuesta de nitro2k01: codificado.

I&#39;ve got two contradicting answers now. One recommends escaping &#39; and the other does not. What should I believe?

Por lo tanto, va en ambos sentidos.

Sin embargo, el código fuente de esta página nunca usa &apos;. Todas las codificaciones son de la forma &#39;. Esto es consistente con nitro2k01 y el consejo de drew de no usar &apos;.

jkdev
fuente
1
Aunque en las 3 instancias no necesita ser codificado en HTML.
MrWhite
1

¿A dónde va esa cuerda?

Su respuesta depende del contexto:

  1. Si está escribiendo un párrafo en HTML con estos datos, podría ser suficiente para escapar de <,> y &:

    <p>{string}</p>

  2. 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:

string = "' onmouseover='alert(\"nasty script here!\")' data-ignore='"
  1. 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.

  2. 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 &amp;y "como &quot;? ¿Los convertirá en &amp;amp;y &amp;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

Chaim-Leib Halbert
fuente
-1

Si tu apóstrofe pertenece al contenido, escapa de él. Cualquier otro carácter de contenido que pueda confundirse con el código, escapa.

Dom
fuente
"Si tu apóstrofe pertenece al contenido, escapa de él". - Esto parece ser incorrecto (como si le faltara la palabra "no"). Si el apóstrofe es parte del contenido, entonces no lo escape, no debería ser necesario.
MrWhite
-4

La forma más fácil de hacer el trabajo sin usar la entidad real es usar PHP htmlentities()o htmlspecialchars()funciones:

$val = htmlspecialchars("Don't", ENT_QUOTES, 'UTF-8');
if($_POST){
  $val = htmlspecialchars(trim($_POST['val']), ENT_QUOTES, 'UTF-8');
}
echo "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'> 
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en' class='njs'> 
  <head>
    <meta http-equiv='Content-type' content='text/html;charset=utf-8' />
    <title>Special Characters</title>
    <style type='text/css'>
      @import 'special.css';
    </style>
  </head>
<body>
  <form method='post' action='' id='fm' name='fm'>
    <input type='text' value='$val' name='val' id='val' />
    <input type='submit' value='submit' name='sub' id='sub' />
  </form>
</body>
  <script type='text/javascript' src='special.js'></script>
</html>";
TheCongregation
fuente
44
¿Esto es una broma?
Su '
@Su 'Me temo que no lo es ...
William Edwards