Protégez votre site Web contre une faille de sécurité très courante grâce à la gestion CSRF intégrée de Django.
Django est un framework Web Python que vous pouvez utiliser pour créer des applications Web sécurisées. Il offre de nombreuses fonctionnalités pour aider les développeurs en matière de sécurité. L'une de ces fonctionnalités est les jetons CSRF, essentiels pour protéger les formulaires contre les attaques Cross-Site Request Forgery.
Qu'est-ce qu'un jeton CSRF?
Un jeton CSRF est une fonction de sécurité qui protège les applications Web contre Attaques CSRF (Cross-Site Request Forgery). Il permet au serveur d'application de vérifier si une soumission de formulaire provient d'un navigateur authentique ou si un pirate l'a falsifié.
Les jetons CSRF sont des entrées de formulaire qui gardent une trace d'une session utilisateur. Un site Web cadre d'application Web côté serveur génère généralement des jetons CSRF pour chaque session utilisateur unique. Le serveur vérifie si le jeton est correct chaque fois qu'un utilisateur soumet un formulaire. Les jetons CSRF sont généralement constitués de chaînes et de nombres aléatoires, ce qui rend leurs valeurs imprévisibles.
Génération de jetons CSRF dans Django
Django's get_token() La fonction génère aléatoirement des jetons CSRF. Pour trouver cette fonction, accédez à la csrf.py fichier à l'intérieur de votre Environnement virtuel Python. La structure du dossier devrait ressembler à ceci :
env/
└── Lib/
└── forfaits-site/
└── django/
└── middleware/
└── csrf.py
Dans ce fichier, vous trouverez le get_token() fonction, qui renvoie le jeton. Django utilise masquage des données pour protéger la valeur du jeton des pirates.
Par défaut, Django active la protection CSRF pour votre site en ajoutant django.middleware.csrf. CsrfViewMiddleware dans le INTERMÉDIAIRES liste de vos paramètres.py déposer. Tout ce que vous avez à faire est d'ajouter {% csrf_token %} à ton POSTE formes. Sans ajouter {% csrf_token %}, vous obtiendrez un 403 (interdit) erreur lorsque vous soumettez un formulaire.
Lorsque vous ajoutez {% csrf_token %} à votre formulaire, il crée automatiquement un champ de saisie masqué avec le nom csrfmiddlewaretoken, qui contient la valeur du jeton CSRF masqué. Le serveur utilise cette valeur pour déterminer si la soumission du formulaire est authentique. Vous pouvez vérifier la valeur de ce champ masqué en affichant la source de la page ou en utilisant la fonction d'outils de développement de votre navigateur.
Comment fonctionnent les jetons CSRF dans Django
Lorsque vous lancez votre site avec le formulaire, Django crée automatiquement un cookie du navigateur appelé csrftoken. Ce cookie garde une trace de l'activité des utilisateurs sur le site et identifie de manière unique chaque utilisateur.
Lorsque l'utilisateur soumet le formulaire, le serveur compare la valeur du cookie à la valeur du csrfmiddlewaretoken dans le champ de saisie caché. Si ces valeurs correspondent, le serveur traitera le formulaire avec succès, sinon il produira une erreur.
A première vue, les valeurs du cookie et du csrfmiddlewaretoken paraissent différents. Ceci est intentionnel et ajoute une couche de protection supplémentaire au jeton CSRF. Le jeton CSRF est comparé au cookie comme ceci :
- Le get_token() La fonction masque le jeton CSRF avant de le transmettre au champ de saisie.
- Lorsque le formulaire est soumis, le jeton CSRF est démasqué à l'aide de la clé secrète dans le fichier de paramètres.
- Le jeton non masqué est comparé au cookie de session.
- Si les valeurs sont identiques, le formulaire est traité. Sinon, le serveur renvoie une erreur.
Pour empêcher les pirates de voler votre jeton CSRF, Django le renouvelle à chaque fois qu'il démarre une session utilisateur.
Création de jetons CSRF personnalisés
Bien que Django facilite la protection de vos formulaires en ajoutant simplement le {% csrf_token %}, générer des jetons CSRF et les ajouter manuellement à vos formulaires est également possible. Pour ce faire, importez le get_token() fonction:
depuis django.middleware.csrf importer get_token
À votre avis, vous pouvez générer le jeton CSRF comme ceci :
définitivementnom_vue(demande):
csrf_token = get_token (demande)# exécuter la logique de vue
contexte = {
"csrf_token": csrf_token
}
retour rendre (demander, 'nom_app/template.html', contexte=contexte)
Dans votre modèle HTML, vous pouvez inclure manuellement votre balise d'entrée et ajouter le csrf_token à ça comme ça :
<formerméthode="POSTE" >
<saisirtaper="caché"nom="csrfmiddlewaretoken"valeur="{{ csrf_token }}">
{{form.as_p}}
<boutontaper="soumettre"classe="btn btn-outline-secondaire">Ajouter un livrebouton>
former>
Alternativement, vous pouvez générer le champ de saisie masqué à partir de vos vues comme ceci :
définitivementta vue(demande):
csrf_token = get_token (demande)
csrf_token_html = ''.format (csrf_token)# exécuter la logique de vue
contexte = {
"csrf_token": csrf_token_html
}
retour rendre (demander, 'nom_app/template.html', contexte=contexte)
Vous pouvez ensuite l'ajouter à votre modèle HTML comme ceci :
<formerméthode="POSTE" >
{{ csrf_token_html|sûr }}
{{form.as_p}}
<boutontaper="soumettre"classe="btn btn-outline-secondaire">Ajouter un livrebouton>
former>
Si vous souhaitez contrôler complètement la protection CSRF de votre formulaire, vous pouvez le faire en comparant votre jeton CSRF au cookie stocké dans le navigateur. En fonction des résultats de la comparaison, vous pouvez gérer la soumission du formulaire comme vous le souhaitez. Voici un exemple :
depuis django.raccourcis importer rendre
depuis django.middleware.csrf importer get_token, _unmask_cipher_token
depuis django.utils.crypto importer constant_time_comparedéfinitivementta vue(demande):
# Générer un jeton CSRF personnalisé
csrf_token = get_token (demande)
csrf_cookie = demande. COOKIES.get('csrftoken')# démasquer le jeton csrf
unmasked_csrf_token = _unmask_cipher_token (csrf_token)
# Comparez les jetons
sipas constant_time_compare (unmasked_csrf_token, csrf_cookie) :
# Gérer le cas où les jetons ne correspondent pas
passer
autre:
# Gérer le cas où les jetons correspondent
passer
# Rendre le modèle
contexte = {
'csrf_token': csrf_token,
}
retour rendre (demander, 'nom_app/template.html', contexte=contexte)
Cet extrait de code récupère le csrf_cookie à partir de l'objet de requête HTTP. Il utilise alors le _unmask_cipher_token() fonction pour démasquer csrf_token.
Une instruction conditionnelle compare les valeurs des csrf_cookie et le démasqué csrf_token. Cette comparaison utilise le constant_time_compare fonction de protection contre les exploits de synchronisation. Vous pouvez écrire votre logique en fonction du résultat de la comparaison.
Désactivation de la protection CSRF dans Django
Même si Django prévoit une disposition par défaut pour la protection CSRF, vous pouvez la désactiver dans votre projet si vous le souhaitez. Il y a deux façons de faire ça:
- Désactivation de la protection CSRF sur l'ensemble de votre site Web.
- Désactivation de la protection CSRF sur une vue spécifique.
Désactivation de la protection CSRF sur l'ensemble de votre site Web
Pour désactiver la protection CSRF de Django sur votre site Web, il vous suffit de supprimer le middleware CSRF de votre fichier de paramètres. Dans votre fichier de paramètres, recherchez une liste appelée INTERMÉDIAIRES. Dans la liste, recherchez ceci :
'django.middleware.csrf. CsrfViewMiddleware',
Une fois que vous l'avez trouvé, vous devez le supprimer de votre code pour que la protection CSRF par défaut de Django le désactive.
Désactivation de la protection CSRF sur une vue spécifique
Si vous souhaitez uniquement désactiver la protection CSRF sur une vue Django spécifique, utilisez le @csrf_exempt décorateur. Voici un extrait de code pour illustrer :
depuis django.views.decorators.csrf importer csrf_exempt
@csrf_exempt
définitivementnom_vue(demande):
# exécuter la logique de vue
passer
Le @csrf_exempt décorateur n'est qu'un des nombreux liés à la protection CSRF dans Django. Vous pouvez lire le reste sur La référence CSRF de Django.
Ne désactivez pas la protection CSRF sur votre site Web
Bien que Django le rende possible, la désactivation du mécanisme de protection CSRF intégré de Django n'est pas recommandée. Cela rendra votre site vulnérable aux attaques CSRF et affectera finalement négativement les utilisateurs de votre application.
Sauf si vous êtes un développeur expérimenté qui sait comment implémenter un mécanisme de protection CSRF personnalisé, vous devez travailler avec l'alternative fournie par Django.