Jinja: L'échappement automatique désactivé par défaut est une valeur par défaut dangereuse

Créé le 6 janv. 2016  ·  4Commentaires  ·  Source: pallets/jinja

J'ai découvert aujourd'hui grâce à un XSS signalé en externe que Jinja n'active pas l'échappement automatique par défaut. Il s'agit d'une valeur par défaut dangereuse, rendue encore plus dangereuse par le fait que de nombreuses personnes sont initiées à Jinja grâce à leur connaissance antérieure des modèles Django, qui ont l'échappement automatique activé par défaut depuis 2007.

En regardant sur Internet, il semble que ce fait ne soit pas très connu. En fait, j'ai même trouvé des livres (Python 3 Object Oriented Programming, chapitre 12, cc @buchuki) qui recommandent d'utiliser jinja2 pour les sites Web et de laisser l'échappement automatique désactivé. Un échantillon aléatoire de projets Github montre également que la plupart des gens n'ajoutent pas autoescape=True ou l'extension autoescape à leur projet.

Bien que je comprenne qu'il serait probablement difficile de migrer vers une valeur par défaut plus sûre à ce stade, la documentation devrait au moins indiquer clairement que l'échappement automatique est désactivé par défaut. Peut-être ajouter autoescape=True à tous les exemples qui créent un objet jinja2.Environment et/ou ajouter une section très tôt dans la documentation.

docs

Commentaire le plus utile

Cela semble être un bon candidat pour une pull request :)

Tous les 4 commentaires

Jinja n'est pas seulement pour HTML, mais un moteur de modèle à usage général. Je pense que la plupart des gens utilisent Jinja dans Flask, qui permet l'échappement automatique par défaut pour les modèles HTML. Si vous intégrez un moteur de template dans votre propre framework, vous êtes censé lire la documentation sur la façon de l'utiliser en toute sécurité.

Cela dit, je pense qu'être très clair dans la documentation que vous devriez probablement utiliser l'échappement automatique lors de la génération de HTML est une bonne suggestion.

Je suppose que la plupart des principaux frameworks y parviennent (plus d'yeux, moins de bugs, etc.), mais il existe également de nombreux projets plus petits intégrant Jinja manuellement qui commettent cette erreur.

Et pour être franc, la documentation de Jinja est vraiment pauvre sur ce sujet. Voici ce que vous voyez pour la première fois lorsque vous ouvrez la documentation de Jinja :

Jinja2 est un langage de modélisation moderne et convivial pour Python, inspiré des modèles de Django. Il est rapide, largement utilisé et sécurisé avec l'environnement d'exécution de modèle en bac à sable en option :

« modélisé d'après les modèles de Django » et « sécurisé » pourraient amener à penser qu'il possède les fonctionnalités de sécurité des modèles de Django telles que l'échappement automatique.

Ensuite, un exemple, qui est HTML. Et juste après, dans la liste des fonctionnalités :

puissant système d'échappement HTML automatique pour la prévention XSS

Ce qui ne mentionne pas que c'est facultatif et non activé par défaut.

La page de documentation "Utilisation de l'API de base" n'affiche pas l'échappement automatique activé, mais elle n'affiche pas non plus le HTML, donc je suppose que ça va. Mais alors quand vous allez sur la page "Basics" de l'

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

Le premier exemple est vulnérable aux XSS triviaux. Les gens ont raison d'être confus.

Cela semble être un bon candidat pour une pull request :)

Nous ne pouvons pas désactiver cela maintenant sans casser le code de tout le monde. Je suis cependant heureux de mettre à jour les documents en conséquence. Je vais fermer cela comme un correctif, mais n'hésitez pas à ouvrir un PR pour les mises à jour de la documentation.

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

DriverX picture DriverX  ·  4Commentaires

harobed picture harobed  ·  6Commentaires

htgoebel picture htgoebel  ·  4Commentaires

AMDmi3 picture AMDmi3  ·  4Commentaires

mtrstudio picture mtrstudio  ·  5Commentaires