recherche
Maisondéveloppement back-endTutoriel PythonUtilisation de la protection CSRF avec les requêtes Django et AJAX

Using CSRF Protection with Django and AJAX Requests

Sécurisation des requêtes Django AJAX avec la protection CSRF

La protection CSRF (Cross-Site Request Forgery) intégrée de Django, activée par défaut lors de la création d'un projet avec django-admin startproject, utilise un jeton CSRF pour se protéger contre les requêtes malveillantes. Ce middleware est ajouté à votre settings.py.

Chaque requête POST adressée à votre application Django nécessite un jeton CSRF valide. Dans les modèles Django, ceci est réalisé en incluant {% csrf_token %} dans n'importe quel formulaire en utilisant la méthode POST. Cependant, la gestion de la protection CSRF avec des requêtes AJAX frontales distinctes nécessite une approche différente.

Ce tutoriel montre comment sécuriser une application Django simple avec des requêtes AJAX provenant d'un front-end séparé.

Configuration de l'application

Notre exemple d'application comporte deux points de terminaison :

  • GET /get-picture : Récupère l'URL d'une image stockée sur le serveur.
  • POST /set-picture : Met à jour l'URL de l'image stockée sur le serveur.

Pour plus de simplicité, la gestion des erreurs est omise. Le code backend initial (dans urls.py) est le suivant :

from django.urls import path
from django.http import JsonResponse
import json

picture_url = "https://picsum.photos/id/247/720/405"

def get_picture(request):
    return JsonResponse({"picture_url": picture_url})

def set_picture(request):
    if request.method == "POST":
        global picture_url
        picture_url = json.loads(request.body)["picture_url"]
        return JsonResponse({"picture_url": picture_url})

urlpatterns = [
    path("get-picture", get_picture),
    path("set-picture", set_picture)
]

Les fonctions front-end correspondantes (simplifiées) :

// GET request to retrieve the image URL
async function get_picture() {
    const res = await fetch("http://localhost:8000/get-picture");
    const data = await res.json();
    return data.picture_url;
}

// POST request to update the image URL
async function set_picture(picture_url) {
    const res = await fetch("http://localhost:8000/set-picture", {
        method: "POST",
        body: JSON.stringify({ "picture_url": picture_url })
    });
}

Pour gérer le partage de ressources cross-origine (CORS), nous utiliserons le package django-cors-headers.

Activation de la protection CORS et CSRF

Installer django-cors-headers :

pip install django-cors-headers

Configurer settings.py :

INSTALLED_APPS = [
    "corsheaders",
    # ... other apps
]

MIDDLEWARE = [
    "corsheaders.middleware.CorsMiddleware",
    # ... other middleware
]

CORS_ALLOWED_ORIGINS = ["http://localhost:4040"] # Adjust port as needed
CSRF_TRUSTED_ORIGINS = ["http://localhost:4040"] # Add your frontend origin

Bien que les requêtes GET fonctionnent désormais correctement, les requêtes POST échoueront en raison de la protection CSRF. Pour résoudre ce problème, nous devons gérer manuellement les jetons CSRF.

Récupération et utilisation du jeton CSRF

Créez une nouvelle vue pour servir le jeton CSRF :

from django.views.decorators.csrf import ensure_csrf_cookie
from django.http import JsonResponse

@ensure_csrf_cookie
def get_csrf_token(request):
    return JsonResponse({"success": True})

urlpatterns = [
    # ... other paths
    path("get-csrf-token", get_csrf_token),
]

Mettez à jour le front-end pour récupérer le jeton (en utilisant js-cookie) :

fetch("http://localhost:8000/get-csrf-token", { credentials: "include" });

L'option credentials: "include" garantit que le navigateur gère tous les en-têtes Set-Cookie, en stockant le cookie csrftoken. Inspectez l'onglet Réseau dans les outils de développement de votre navigateur pour vérifier que le cookie est défini.

Modifier la requête POST

Enfin, modifiez la fonction set_picture pour inclure le token CSRF dans l'en-tête :

async function set_picture(picture_url) {
    const res = await fetch("http://localhost:8000/set-picture", {
        method: "POST",
        credentials: "include",
        headers: {
            'X-CSRFToken': Cookies.get("csrftoken")
        },
        body: JSON.stringify({ "picture_url": picture_url })
    });
}

Cela ajoute l'en-tête X-CSRFToken avec la valeur du cookie csrftoken, permettant ainsi les requêtes POST réussies.

Considérations importantes

Cette approche présente des limites, notamment lors du déploiement du front-end et du back-end sur des domaines différents. Les politiques de sécurité du navigateur peuvent empêcher la configuration ou l'accès à des cookies tiers, ce qui a un impact sur la gestion des jetons CSRF.

Ressources

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
En quoi les tableaux Numpy diffèrent-ils des tableaux créés à l'aide du module de tableau?En quoi les tableaux Numpy diffèrent-ils des tableaux créés à l'aide du module de tableau?Apr 24, 2025 pm 03:53 PM

NumpyArraysarebetterFornumericalOperations andMulti-dimensionaldata, tandis que la réalisation de la réalisation

Comment l'utilisation des tableaux Numpy se compare-t-il à l'utilisation des tableaux de modules de tableau dans Python?Comment l'utilisation des tableaux Numpy se compare-t-il à l'utilisation des tableaux de modules de tableau dans Python?Apr 24, 2025 pm 03:49 PM

NumpyArraysareBetterForheAVYVumericalComputing, tandis que la réalisation de points contraints de réalisation.1) NumpyArraySoFerversATACTORATIONS ajusté pour les données

Comment le module CTYPES est-il lié aux tableaux dans Python?Comment le module CTYPES est-il lié aux tableaux dans Python?Apr 24, 2025 pm 03:45 PM

CTYPESALLOWSCREATINGAndMANIPulationc-styLearRaySInpython.1) UsectypeStOinterfaceWithClibraryForPerformance.2) Createc-stylearRaysFornumericalComptations.3) PassArrayStocfunction

Définissez 'Array' et 'List' dans le contexte de Python.Définissez 'Array' et 'List' dans le contexte de Python.Apr 24, 2025 pm 03:41 PM

Inpython, une "liste" isaversatile, mutablesencethatcanholdmixed datatypes, tandis que "tableau" est une cohérence homogène, une séquestre.

Une liste Python est-elle mutable ou immuable? Qu'en est-il d'un tableau Python?Une liste Python est-elle mutable ou immuable? Qu'en est-il d'un tableau Python?Apr 24, 2025 pm 03:37 PM

Pythonlistsandarraysarebothmutable.1) listsaxiblendupportheterogeneousdatabutarelessmemory-efficace.2) ArraysareMoreMory-EfficientForHomogeneousDatabutlessversatile, nécessitant un niveaumorypecodeusagetoavoiderrors.

Python vs C: Comprendre les principales différencesPython vs C: Comprendre les principales différencesApr 21, 2025 am 12:18 AM

Python et C ont chacun leurs propres avantages, et le choix doit être basé sur les exigences du projet. 1) Python convient au développement rapide et au traitement des données en raison de sa syntaxe concise et de son typage dynamique. 2) C convient à des performances élevées et à une programmation système en raison de son typage statique et de sa gestion de la mémoire manuelle.

Python vs C: Quelle langue choisir pour votre projet?Python vs C: Quelle langue choisir pour votre projet?Apr 21, 2025 am 12:17 AM

Le choix de Python ou C dépend des exigences du projet: 1) Si vous avez besoin de développement rapide, de traitement des données et de conception du prototype, choisissez Python; 2) Si vous avez besoin de performances élevées, de faible latence et de contrôle matériel, choisissez C.

Atteindre vos objectifs python: la puissance de 2 heures par jourAtteindre vos objectifs python: la puissance de 2 heures par jourApr 20, 2025 am 12:21 AM

En investissant 2 heures d'apprentissage Python chaque jour, vous pouvez améliorer efficacement vos compétences en programmation. 1. Apprenez de nouvelles connaissances: lire des documents ou regarder des tutoriels. 2. Pratique: Écrivez du code et complétez les exercices. 3. Revue: consolider le contenu que vous avez appris. 4. Pratique du projet: Appliquez ce que vous avez appris dans les projets réels. Un tel plan d'apprentissage structuré peut vous aider à maîtriser systématiquement Python et à atteindre des objectifs de carrière.

See all articles

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Puissant environnement de développement intégré PHP

Dreamweaver Mac

Dreamweaver Mac

Outils de développement Web visuel

VSCode Windows 64 bits Télécharger

VSCode Windows 64 bits Télécharger

Un éditeur IDE gratuit et puissant lancé par Microsoft

Télécharger la version Mac de l'éditeur Atom

Télécharger la version Mac de l'éditeur Atom

L'éditeur open source le plus populaire

Listes Sec

Listes Sec

SecLists est le compagnon ultime du testeur de sécurité. Il s'agit d'une collection de différents types de listes fréquemment utilisées lors des évaluations de sécurité, le tout en un seul endroit. SecLists contribue à rendre les tests de sécurité plus efficaces et productifs en fournissant facilement toutes les listes dont un testeur de sécurité pourrait avoir besoin. Les types de listes incluent les noms d'utilisateur, les mots de passe, les URL, les charges utiles floues, les modèles de données sensibles, les shells Web, etc. Le testeur peut simplement extraire ce référentiel sur une nouvelle machine de test et il aura accès à tous les types de listes dont il a besoin.