Exercices Concepts Web & Django Validation CSRF avec Django
🎉

Bravo!

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

Validation CSRF avec Django

Le CSRF (Cross-Site Request Forgery) est une attaque ou un site malveillant fait des requêtes en ton nom. Django se protege automatiquement avec un token CSRF : un code secret génère pour chaque session, qui doit etre present dans chaque formulaire POST.

Django utilise le module django.middleware.csrf pour ca. On peut générer un token avec get_token() et vérifier un token avec _sanitize_token().

Mais pour comprendre le mecanisme, on va le reimplémenter en utilisant les outils de Django.

Le module secrets de Python fournit token_hex() pour générer des tokens cryptographiquement surs (bien mieux que random) :

import secrets
token = secrets.token_hex(16) # 32 caracteres hexadecimaux

Écris trois fonctions :

- generate_csrf_token(length=32) : génère un token hexadecimal de length caracteres avec secrets.token_hex(length // 2)

- validate_csrf_token(request_token, session_token) : compare les deux tokens de facon securisee avec hmac.compare_digest (qui previent les attaques par timing). Retourne False si l'un des tokens est vide ou None.

- protect_form_submission(request_data, session_data) : extrait les tokens de request_data['csrf_token'] et session_data['csrf_token'], puis appelle validate_csrf_token

Exemple :

token = generate_csrf_token()
len(token) vaut 32
validate_csrf_token(token, token) vaut True
validate_csrf_token('abc', 'xyz') vaut False

Tests (4/5)

Token génère avec bonne longueur
import secrets, hmac
token = generate_csrf_token()
assert len(token) == 32
Token génère longueur custom
import secrets, hmac
token = generate_csrf_token(16)
assert len(token) == 16
Validation identiques
import secrets, hmac
assert validate_csrf_token('abc123', 'abc123') == True
Validation differents
import secrets, hmac
assert validate_csrf_token('abc', 'xyz') == False

+ 0 tests cachés

Indices (3 disponibles)

solution.py