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 '<script>alert(1)</script>'
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
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 '<b>' in result
+ 0 tests cachés
Indices (3 disponibles)
Solution officielle
import django
from django.conf import settings
if not settings.configured:
settings.configure(
DATABASES={},
INSTALLED_APPS=['django.contrib.contenttypes'],
DEFAULT_AUTO_FIELD='django.db.models.BigAutoField',
)
django.setup()
from django.utils.html import escape, strip_tags
def sanitize_comment(text):
text = strip_tags(text)
text = escape(text)
return text
def safe_render_html(template_str, context):
result = template_str
for key, value in context.items():
result = result.replace('{' + key + '}', escape(str(value)))
return result