Comprendre les jetons CSRF de Django : Ce qu’ils sont et pourquoi vous en avez besoin
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 le jeton CSRF, essentiel pour protéger les formulaires contre les attaques de type 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 les attaques de type Cross-Site Request Forgery (CSRF). Il permet au serveur d’application de vérifier si la soumission d’un formulaire provient d’un navigateur authentique ou d’un pirate informatique qui l’a falsifiée.
Les jetons CSRF sont des entrées de formulaire qui permettent de suivre la session d’un utilisateur. Le cadre d’application web côté serveur d’un site web 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
Les fonctions de Django get_token() de Django génère aléatoirement des jetons CSRF. Pour trouver cette fonction, naviguez jusqu’au fichier csrf.py dans votre environnement virtuel Python. La structure du dossier devrait ressembler à ceci :
À l’intérieur de ce fichier, vous trouverez le fichier get_token() qui renvoie le jeton. Django utilise le masquage de données pour protéger la valeur du jeton contre les pirates informatiques.
Par défaut, Django active la protection CSRF pour votre site en ajoutant la fonction django.middleware.csrf.CsrfViewMiddleware dans le fichier MIDDLEWARE de votre settings.py de votre fichier settings.py. Tout ce que vous avez à faire est d’ajouter % csrf_token % à votre fichier POST de vos formulaires. Sans ajouter de % csrf_token %, vous obtiendrez un 403 (interdit) lorsque vous soumettez un formulaire.
Lorsque vous ajoutez % csrf_token % à votre formulaire, il crée automatiquement un champ de saisie caché 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 caché en consultant la source de la page ou en utilisant les outils de développement de votre navigateur.
Fonctionnement des jetons CSRF dans Django
Lorsque vous lancez votre site avec le formulaire, Django crée automatiquement un cookie de navigateur appelé csrftoken. Ce cookie garde la trace de l’activité de l’utilisateur sur le site et identifie chaque utilisateur de manière unique.
Lorsque l’utilisateur soumet le formulaire, le serveur compare la valeur du cookie à la valeur de l’élément csrfmiddlewaretoken dans le champ de saisie caché. Si ces valeurs correspondent, le serveur traitera le formulaire avec succès, sinon il produira une erreur.
À première vue, les valeurs du cookie et de l’élément csrfmiddlewaretoken semblent être différents. Ceci est intentionnel et ajoute une couche de protection supplémentaire au jeton CSRF. Le jeton CSRF est comparé au cookie comme suit :
- Le jeton get_token() 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 du fichier de configuration.
- Le jeton démasqué est comparé au cookie de session.
- Si les valeurs sont identiques, le formulaire est traité. Dans le cas contraire, 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 jeton % csrf_token % il est également possible de générer des jetons CSRF et de les ajouter manuellement à vos formulaires. Pour ce faire, importez le fichier get_token() :
Dans votre vue, vous pouvez générer le jeton CSRF comme suit :
Dans votre modèle HTML, vous pouvez inclure manuellement votre balise input et ajouter la balise csrf_token comme suit :
Alternativement, vous pouvez générer le champ de saisie caché à partir de vos vues comme ceci :
Vous pouvez ensuite l’ajouter à votre modèle HTML comme ceci :
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 traiter la soumission du formulaire comme vous le souhaitez. Voici un exemple :
Cet extrait de code récupère le csrf_cookie de l’objet de requête HTTP. Il utilise ensuite l’objet _unmask_cipher_token() pour démasquer le csrf_token.
Une instruction conditionnelle compare les valeurs de la fonction csrf_token récupérée. csrf_cookie et de la valeur non masquée csrf_token. Cette comparaison utilise le constant_time_compare pour se protéger contre les exploits temporels. Vous pouvez écrire votre logique en fonction du résultat de la comparaison.
Désactiver la protection CSRF dans Django
Même si Django prévoit par défaut une protection CSRF, vous pouvez la désactiver dans votre projet si vous le souhaitez. Il existe deux façons de procéder :
- Désactiver la protection CSRF sur l’ensemble de votre site web.
- Désactiver 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, vous devez simplement supprimer l’intergiciel CSRF de votre fichier de configuration. Dans votre fichier de configuration, localisez une liste appelée MIDDLEWARE. Dans cette liste, recherchez ceci :
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ésactiver la protection CSRF sur une vue spécifique
Si vous souhaitez désactiver la protection CSRF sur une vue spécifique de Django, utilisez l’option @csrf_exempt . Voici un extrait de code pour le démontrer :
Le décorateur @csrf_exempt n’est qu’un décorateur parmi d’autres liés à la protection CSRF dans Django. Vous pouvez lire le reste sur Référence CSRF de Django.
Ne désactivez pas la protection CSRF sur votre site web
Bien que Django le permette, il n’est pas recommandé de désactiver le mécanisme de protection CSRF intégré à Django. Cela rendra votre site vulnérable aux attaques CSRF et affectera finalement les utilisateurs de votre application de manière négative.
À moins d’être un développeur expérimenté qui sait comment mettre en œuvre un mécanisme de protection CSRF personnalisé, vous devriez travailler avec l’alternative fournie par Django.
S’abonner à notre lettre d’information
Pourquoi avons-nous besoin d’un jeton CSRF dans Django ?
Django dispose d’une balise percent csrf token percent qui est utilisée pour prévenir les attaques malveillantes. Lors de la génération de la page sur le serveur, il génère un jeton et s’assure que toutes les demandes qui reviennent sont vérifiées par rapport à ce jeton. Le jeton n’est pas inclus dans les demandes entrantes ; elles ne sont donc pas exécutées.
Qu’est-ce que le jeton CSRF et pourquoi est-il nécessaire ?
Un jeton CSRF est un jeton aléatoire sécurisé (par exemple, un jeton de synchronisation ou un jeton de défi) qui est utilisé pour prévenir les attaques CSRF. Le jeton doit être unique pour chaque session d’utilisateur et doit avoir une valeur aléatoire importante pour être difficile à deviner. Une application sécurisée CSRF attribue un jeton CSRF unique pour chaque session d’utilisateur.
Que fait CSRF dans Django ?
L’intergiciel CSRF et la balise de modèle fournissent une protection facile à utiliser contre les falsifications de requêtes intersites.
Comment utiliser le jeton CSRF dans Django ?
Comment utiliser l’intergiciel CSRF de Django ?
- Vous devez ajouter django. middleware. csrf. CsrfViewMiddleware dans le fichier settings.py pour l’activer.
- Django dispose d’une balise modèle qui facilite l’utilisation de la protection CSRF : {% csrf_token %} Dans un modèle qui utilise le formulaire POST, utilisez le csrf_token à l’intérieur de la balise