Django : sécurité et filtre |safe
Bonsoir,
Petite question sécurité.
J'utilise ckeditor actuellement sur un projet. L'utilisateur enregistré a accès à un formulaire pour créer une instance de modèle.
Donc pour afficher correctement le contenu je passe par un filtre |safe. Mais je me souviens avoir vu au début de la formation Django que ça pouvait poser des problèmes de sécurité.
L'exemple était avec une injection de code JS il me semble.
Du coup je me demandais est-ce qu'il y a une bonne pratique qui permetterait d'afficher correctement le contenu sans avoir un problème de sécurité ?
Merci d'avance
{{ idea.details|safe }}
Salut !
Effectivement, utiliser |safe peut présenter des problèmes de sécurité.
Peut être regardes du côté de la bibliothèque "django-bleach". Elle te permet de nettoyer le HTML en retirant les balises et attributs non autorisés tout en conservant le formatage.
D'abord, installe django-bleach :
pip install django-bleach
Ensuite, ajoute-la à ton fichier settings.py :
INSTALLED_APPS = [
# ...
'django_bleach',
]
# Configuration de django-bleach (à adapter selon tes besoins)
BLEACH_ALLOWED_TAGS = ['p', 'b', 'i', 'u', 'em', 'strong', 'a', 'img', 'ul', 'ol', 'li', 'br', 'sub', 'sup']
BLEACH_ALLOWED_ATTRIBUTES = ['href', 'title', 'src', 'alt']
BLEACH_ALLOWED_STYLES = ['color', 'background-color', 'font-size', 'text-decoration']
BLEACH_STRIP_TAGS = True
Enfin, dans ton template, utilise le filtre |bleach au lieu de |safe :
{{ idea.details|bleach }}
Je l'ai déjà utilisé une fois. A voir peut être si Thibault a déjà utilisé autre chose ?
Hummm pas sûr, pour être sûr je mettrais explicitement uniquement les balises que tu veux autoriser. a adapter à ton besoin (sur le rpo github de la lib https://github.com/marksweb/django-bleach)
# Which HTML tags are allowed
BLEACH_ALLOWED_TAGS = ['p', 'b', 'i', 'u', 'em', 'strong', 'a']
# Which HTML attributes are allowed
BLEACH_ALLOWED_ATTRIBUTES = ['href', 'title', 'style']
# Which CSS properties are allowed in 'style' attributes (assuming
# style is an allowed attribute)
BLEACH_ALLOWED_STYLES = [
'font-family', 'font-weight', 'text-decoration', 'font-variant']
# Strip unknown tags if True, replace with HTML escaped characters if
# False
BLEACH_STRIP_TAGS = True
# Strip comments, or leave them in.
BLEACH_STRIP_COMMENTS = False
Du coup je n'ai pas résolu mon problème. Avec Bleach c'est un peu galère car du coup ça limite à fond ckeditor.
J'ai eu une idée, mais je n'ai pas trouvé de solution.

ça aurait été de supprimer la fonctionnalité de passer en mode HTML !
Je vais quand même essayer de chercher encore ^^
Salut Gab et PA !
Je confirme, il y a plein de façons de faire, si tu passes par les formulaires, il va automatiquement échapper les éléments qui peuvent être problématiques quand tu vas afficher ton formulaire (avec par exemple {{ form.as_p }}).
Par exemple, < serait converti en <, > en >, etc.
Après ça dépend de ce que tu veux faire avec les données. Par exemple sur Docstring je souhaite que vous puissiez afficher du code, donc je fais un processus spécifique pour filtrer en dehors des blocs de code avec bleach pour enlever les tags problématiques.
Merci !
perso je ne veux pas que l'utilisateur puisse afficher du code comme dans docstring.
> il va automatiquement échapper les éléments qui peuvent être problématiques
donc même avec safe, je n'aurai pas de problèmes de sécurité comme je passe par un formulaire ? Si j'ai bien compris ce que tu m'as expliqué. (J'espère avoir bien compris lol)
https://docs.djangoproject.com/fr/4.2/topics/security/ ==> Je viens de lire les premiers paragraphes.
Je peux me passer de bleach au final ?
hello oui du coup pour moi pas de pb de securite de ce côte là. Et puis bleach c´est juste pour gerer les balises donc je pense que tu peix t'en passer ici sintu gères directement via le formulaire.
Hier soir j'ai fait un test en envoyant un commentaire avec du JS.
Le JS a été pris en compte ça pourri la page web lol.
Donc en fait je vais être obligé de passer par Bleach je pense. Si je ne trouve pas d'autres solutions. Je voulais désactiver la possibilité d'utiliser directement du code html avec ckeditor mais je n'ai rien trouvé.
Et merci à tous les deux !
J'ai demandé à GPT quelles balises HTML étaient utilisées dans ck editor. Comme ça je n'ai plus qu'à les ajouter dans BLEACH ^^.
Donc je pars bien sur Bleach ! :)
Inscris-toi
(c'est gratuit !)
Tu dois créer un compte pour participer aux discussions.
Créer un compte