¿Por qué los marcos de plantillas de web HTML no escapan de todos los datos de forma predeterminada?

5

Recientemente descubrí una vulnerabilidad XSS en una aplicación que usa JSP para renderizar páginas. El código vulnerable en el JSP era algo como esto:

<td>${customer.notes}</td>

Se solucionó al escapar de la entrada controlada por el usuario, el código resultante tiene este aspecto:

<td><c:out value="${customer.notes}"/></td>

JSP y otros marcos de plantillas que he usado, siempre están predeterminados para que solo escapen datos dinámicos cuando se solicitan específicamente y no escapan de forma predeterminada.

El inverso de esto es claramente un valor predeterminado mucho más seguro, es decir. todos los datos dinámicos se escapan, a menos que indique específicamente que el marco no lo haga.

¿Hay marcos que funcionen de esta manera? ¿Hay un problema importante en cambiar los marcos futuros para comportarse de esta manera? Obviamente, usted incurre en la sobrecarga de los datos de escape que pueden no estar necesariamente controlados por el usuario, pero si tiene problemas de rendimiento, puede desactivarlo cuando sea seguro. ¿Hay algo que me falta?

    
pregunta oggmonster 10.06.2016 - 16:05
fuente

1 respuesta

6
  

¿Existen marcos que funcionen de esta manera?

Claro. Twig o Django serían dos ejemplos.

  

El inverso de esto es claramente un valor predeterminado mucho más seguro, es decir. todos los datos dinámicos se escapan, a menos que indique específicamente que el marco no lo haga.

Sí, esto es mucho más seguro.

  

¿Hay algo que me falta?

El único inconveniente es que XSS es sensible al contexto. La codificación predeterminada puede no ser suficiente [*] y, por lo tanto, puede dar lugar a una falsa sensación de seguridad.

Por otro lado, solo la codificación HTML ' , " , < y > detectarán la gran mayoría de las vulnerabilidades de XSS, por lo que diría que siempre es una buena idea codificar de forma predeterminada y proporciona una opción para deshabilitar la codificación de forma predeterminada si es necesario.

  

¿Por qué los marcos de plantillas web no escapa todos los datos de forma predeterminada?

JSP, por ejemplo, es de 1999. XSS ni siquiera se llamó XSS hasta 2000. Tengo la sensación de que es más probable que los motores más nuevos codifiquen por defecto, porque la importancia de XSS es mayor, y se pone más cuidado en la seguridad ( por defecto). Es probable que los motores más antiguos no quieran romper la compatibilidad hacia atrás y, por lo tanto, no cambien el comportamiento existente.

[*] ejemplo muy simple: <script>var x = foo.[USERINPUT]();</script> .

    
respondido por el tim 11.06.2016 - 10:53
fuente

Lea otras preguntas en las etiquetas