Exercices Concepts Web & Django Echappement HTML avec Django
🎉

Bravo!

Intermédiaire 🧠 Fondamentaux 20 XP 0 personnes ont réussi

Echappement HTML avec Django

Le Cross-Site Scripting (XSS) est une attaque ou quelqu'un injecte du code JavaScript malveillant dans une page web. Par exemple, si un utilisateur ecrit <script>alert('pirate')</script> dans un commentaire et que tu l'affiches tel quel, le code s'exécute dans le navigateur de tous les visiteurs.

Django fournit des outils pour se proteger. Le module django.utils.html contient la fonction escape() qui echappe les caracteres speciaux HTML :

from django.utils.html import escape
escape('<script>alert(1)</script>')
retourne '&lt;script&gt;alert(1)&lt;/script&gt;'

Django fournit aussi strip_tags() qui supprime carrement toutes les balises HTML :

from django.utils.html import strip_tags
strip_tags('<p>Bonjour <b>monde</b></p>')
retourne 'Bonjour monde'

Et mark_safe() qui dit a Django "cette chaine est sure, ne l'echappe pas" :

from django.utils.safestring import mark_safe
safe_html = mark_safe('<b>Gras</b>')

Écris une fonction sanitize_comment(text) qui :
- Utilise strip_tags() pour supprimer toutes les balises HTML
- Utilise escape() sur le résultat pour echapper les caracteres speciaux restants
- Retourne le texte nettoye

Écris aussi safe_render_html(template_str, context) qui :
- Pour chaque clé dans le contexte, echappe la valeur avec escape()
- Remplace les {cle} dans le template par les valeurs echappees
- Retourne le résultat

Exemple :

sanitize_comment('<script>alert("xss")</script>')
retourne 'alert(&quot;xss&quot;)'

safe_render_html('<p>{nom}</p>', {'nom': '<b>Hacker</b>'})
retourne '<p>&lt;b&gt;Hacker&lt;/b&gt;</p>'

Tests (3/4)

Script supprime et echappe
result = sanitize_comment('<script>alert("xss")</script>')
assert '<script>' not in result and 'alert' in result
Balises supprimees
result = sanitize_comment('<p>Bonjour <b>monde</b></p>')
assert '<p>' not in result and '<b>' not in result and 'Bonjour' in result
Rendu securise
result = safe_render_html('<p>{nom}</p>', {'nom': '<b>Hacker</b>'})
assert '<b>' not in result and '&lt;b&gt;' in result

+ 0 tests cachés

Indices (3 disponibles)

solution.py