Jinja: El escape automático deshabilitado de forma predeterminada es un valor predeterminado peligroso

Creado en 6 ene. 2016  ·  4Comentarios  ·  Fuente: pallets/jinja

Descubrí hoy a través de un XSS informado externamente que Jinja no activa el escape automático de forma predeterminada. Este es un valor predeterminado peligroso, que se vuelve aún más peligroso por el hecho de que muchas personas conocen Jinja a través de su conocimiento previo de las plantillas de Django, que tienen el autoescaping habilitado de manera predeterminada desde 2007.

Mirando a través de Internet, parece que este hecho no es muy conocido. De hecho, incluso encontré libros (Python 3 Object Oriented Programming, capítulo 12, cc @buchuki) que recomiendan usar jinja2 para sitios web y dejar el autoescaping desactivado. Una muestra aleatoria de proyectos de Github también muestra que la mayoría de las personas no agregan autoescape = True o la extensión autoescape a su proyecto.

Si bien entiendo que probablemente sería una molestia migrar a un valor predeterminado más seguro en ese momento, la documentación debería al menos dejar en claro que el escape automático está desactivado de manera predeterminada. Tal vez agregue autoescape = True a todos los ejemplos que crean un objeto jinja2.Environment y / o agregue una sección muy temprano en la documentación.

docs

Comentario más útil

Suena como un buen candidato para una solicitud de extracción :)

Todos 4 comentarios

Jinja no es solo para HTML, sino también un motor de plantillas de uso general. Creo que la mayoría de la gente usa Jinja en Flask, que habilita la autoescape de forma predeterminada para las plantillas HTML. Si integra un motor de plantillas en su propio marco, se supone que debe leer la documentación sobre cómo usarlo de manera segura.

Dicho esto, creo que dejar muy claro en los documentos que probablemente debería usar autoescape al generar HTML es una buena sugerencia.

Asumiría que la mayoría de los marcos principales hacen esto bien (más ojos, menos errores, etc.) pero también hay muchos proyectos más pequeños que integran Jinja manualmente que sí cometen este error.

Y para ser franco, la documentación de Jinja es muy pobre sobre ese tema. Esto es lo que ve por primera vez cuando abre la documentación de Jinja:

Jinja2 es un lenguaje de plantillas moderno y fácil de diseñar para Python, modelado a partir de las plantillas de Django. Es rápido, ampliamente utilizado y seguro con el entorno de ejecución de plantillas de espacio aislado opcional:

"modelado a partir de las plantillas de Django" y "seguro" podría llevar a pensar que tiene las características de seguridad de las plantillas de Django, como el autoescaping.

Luego, un ejemplo, que es HTML. Y justo después de eso, en la lista de características:

Potente sistema automático de escape HTML para la prevención XSS

Lo cual no menciona que es opcional y no está habilitado de forma predeterminada.

La página de documentos "Uso básico de API" no muestra el escape automático habilitado, pero tampoco muestra HTML, así que supongo que está bien. Pero luego, cuando vaya a la página "Conceptos básicos" de la

from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('yourapplication', 'templates'))
template = env.get_template('mytemplate.html')
print template.render(the='variables', go='here')

El primer ejemplo es vulnerable a los XSS triviales. La gente tiene razón en estar confundida.

Suena como un buen candidato para una solicitud de extracción :)

No podemos apagar esto ahora sin romper el código de todos. Sin embargo, me complace actualizar los documentos en consecuencia. Cerraré esto como una solución habitual, pero siéntase libre de abrir un PR para actualizaciones de documentación.

¿Fue útil esta página
0 / 5 - 0 calificaciones