2012-01-25 23 views
34

Al codificar datos posiblemente inseguros, ¿hay alguna razón para codificar >?HTML: ¿Debería codificar mayor que o no? (> >)

  • Se validates de cualquier manera.
  • El navegador interpreta el mismo de cualquier manera, (En los casos de attr="data", attr='data', <tag>data</tag>)

Creo que las razones que alguien haría esto son

  • Para simplificar eliminación de etiquetas basadas expresiones regulares. <[^>]+>? (raro)
  • Cadenas no citadas attr=data. : -o (no ocurre)
  • Estética en el código. (¿y qué?)

¿Falta alguna información?

Respuesta

29

En sentido estricto, para evitar la inyección HTML, sólo tiene que codificar < como &lt;.

Si la entrada del usuario se va a poner en un atributo, también codifica " como &quot;.

Si está haciendo las cosas bien y utilizando los atributos entre comillas, no necesita preocuparse por >. Sin embargo, si no está seguro de esto, debería codificarlo solo por tranquilidad, no hará ningún daño.

+2

** Advertencia de seguridad: ** Esta respuesta es incorrecta. Para un ejemplo básico, '' 'es una marca de comilla de atributo aceptable y no se escapa en tal atributo es un vector de ataque. También hay otros vectores de ataque dependiendo del contexto. –

+0

Es cierto que ''' podría usarse en lugar de' "' para la comilla de atributos. De hecho, es posible agregar atributos sin comillas. El desarrollador debe comprender su aplicación sin hacer suposiciones. En mi caso, todos los atributos se citan utilizando el último estándar '" ', por lo que esta respuesta fue correcta para mí. –

15

La especificación HTML4 en su sección 5.3.2 dice que

los autores deberían usar "&gt;" (ASCII decimal 62) en el texto en lugar de ">"

así que se creen debe codificar el mayor signo > como &gt; (porque debe obedecer las normas).

+1

Es bueno tratar de obedecer las normas cuando sea posible - pero todos sabemos que es imposible obedecer los estándares y hacer que su sitio funcione en todos (y obviamente me refiero a los navegadores IE6). Entonces, el sentido común está permitido en ciertas circunstancias, y si puedes hacer algo que funcione en todos los navegadores existentes, y esperas trabajar en todos los navegadores futuros, y es una práctica común, entonces no estoy seguro de que sea necesario seguir dogmáticamente estándares. –

+1

Pero en el caso del póster original, es posible, y simple, obedecer el estándar. ¿Por qué debería hacer algo contra ellos cuando puede evitar eso? –

+4

El estándar dice DEBERÍA, NO DEBE. Y más específicamente: "... para evitar problemas con agentes de usuario más antiguos". Eso significa que, si no se dirige a navegadores anteriores a 1999, no tiene que hacer nada. – user123444555621

-2

La codificación de html chars es siempre un trabajo delicado. Siempre debe codificar lo que necesita ser codificado y siempre usar estándares. El uso de comillas dobles es estándar, e incluso las comillas dentro de las comillas dobles deben codificarse. ENCODE siempre. Imaginar algo como esto

<div> this is my text an img></div> 

Probablemente el img> será analizado desde el navegador como una etiqueta de imagen. Los navegadores siempre intentan resolver las etiquetas o citas sin cerrar. Como dice basile, usa estándares, de lo contrario podrías obtener resultados inesperados sin entender la fuente de los errores.

+0

* "Probablemente el img> será analizado desde el navegador como una etiqueta de imagen" *, creo que no. –

+0

, entonces piensas que no, ¿realmente crees? – albanx

+0

Bueno, [veamos qué piensan los demás] (http://stackoverflow.com/questions/17685535/would-the-browser-ever-try-to-parse-img). –

0

Siempre

Esto es para evitar XSS inyecciones (a través de los usuarios que utilicen cualquiera de sus formas para presentar HTML o Javascript en bruto). Al escapar de su salida, el navegador sabe que no debe analizar ni ejecutar nada de eso, solo mostrarlo como texto.

Esto puede parecer un problema menor si no se trata de resultados dinámicos basados ​​en la entrada del usuario; sin embargo, es importante al menos comprender, si no hacer un buen hábito.

+2

Escapar '<' es para evitar la inyección de XSS. No creo que esto se aplique a '>'. –

3

actuales analizadores HTML navegadores no tienen problemas con uquoted > s

Sin embargo, por desgracia, el uso de expresiones regulares para "parse" HTML en JS es bastante común. (ejemplo: Ext.util.Format.stripTags). También las herramientas de línea de comando mal escritas, IDEs o clases de Java, etc. pueden no ser lo suficientemente sofisticadas como para determinar el limitador de una etiqueta de apertura.

Por lo tanto, es posible que encuentre problemas con el código de la siguiente manera:

<script data-usercontent=">malicious();//"></script> 

(! Tenga en cuenta cómo las golosinas de resaltado de sintaxis este fragmento)

+0

Por supuesto, dependiendo de las circunstancias, es posible que desee hacer esto a propósito para interrumpir los intentos de amateurs de analizar su contenido (consulte https://xkcd.com/859/) –

Cuestiones relacionadas