Nouveau : Datasets open source gratuits disponibles !Decouvrir →
🐍
Intermediaire 25 min Django

Securiser une application Django

Pourquoi Securiser une application Django ?

La sécurité est la première priorité dans le développement d'applications web, et Django est un framework Python qui prend en compte cette importance. Dans le contexte réel, chaque développeur doit comprendre l'importance de la sécurité pour prévenir les attaques et protéger les données des utilisateurs. Un cas concret de ce qu'il faut protéger est une application e-commerce où l'authentification et la confidentialité des transactions sont cruciales.

Prerequis

  • Connaissance du framework Django
  • Connaissances en Python
  • Connaissance de base de bases de données SQL (comme PostgreSQL ou SQLite)
  • Installation d'un environnement virtuel pour Python (venv)
  • Un IDE ou un éditeur de code (par exemple, Visual Studio Code)

Concepts fondamentaux

1. Authentification et autorisation

L'authentification vérifie l'identité de l'utilisateur tandis que l'autorisation détermine ce qu'un utilisateur peut faire une fois authentifié.

## Exemple de modèle d'utilisateur personnalisé avec Django
from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    # Ajout de champs supplémentaires si nécessaire
    pass

2. Gestion des mots de passe

Django utilise un système robuste pour gérer les mots de passe, y compris la salage et le stockage sécurisé.

## Configuration du gestionnaire de mots de passe dans settings.py
PASSWORD_HASHERS = [
    'django.contrib.auth.hashers.PBKDF2PasswordHasher',
    # autres hashers
]

3. Middleware

Le middleware est une série d'objets qui exécutent des tâches avant et après chaque requête HTTP.

## Exemple de middleware pour ajouter des en-têtes HTTP personnalisés
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    # autres middlewares
]

class CustomHeaderMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)
        response['X-Custom-Header'] = 'Hello World'
        return response

4. HTTPS et SSL/TLS

Utiliser un certificat SSL/TLS pour sécuriser les communications entre le client et le serveur.

## Installer Certbot et obtenir un certificat Let's Encrypt
sudo apt update
sudo apt install certbot python3-certbot-nginx

## Configurer Certbot pour votre domaine
sudo certbot --nginx -d example.com

Mise en pratique : projet fil rouge

Nous allons construire un simple gestionnaire de tâches en utilisant Django.

Étape 1 : Création du projet

django-admin startproject task_manager
cd task_manager

Étape 2 : Création de l'application

python manage.py startapp tasks

Ajoutez tasks à INSTALLED_APPS dans settings.py.

Étape 3 : Création du modèle

Dans tasks/models.py :

from django.db import models
from django.contrib.auth.models import User

class Task(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    description = models.TextField()
    completed = models.BooleanField(default=False)

    def __str__(self):
        return self.title

Étape 4 : Création des vues

Dans tasks/views.py :

from django.shortcuts import render, redirect
from .models import Task
from .forms import TaskForm

def task_list(request):
    tasks = Task.objects.filter(user=request.user)
    return render(request, 'tasks/task_list.html', {'tasks': tasks})

def task_create(request):
    if request.method == 'POST':
        form = TaskForm(request.POST)
        if form.is_valid():
            task = form.save(commit=False)
            task.user = request.user
            task.save()
            return redirect('task_list')
    else:
        form = TaskForm()
    return render(request, 'tasks/task_form.html', {'form': form})

def task_update(request, pk):
    task = Task.objects.get(pk=pk)
    if request.method == 'POST':
        form = TaskForm(request.POST, instance=task)
        if form.is_valid():
            form.save()
            return redirect('task_list')
    else:
        form = TaskForm(instance=task)
    return render(request, 'tasks/task_form.html', {'form': form})

def task_delete(request, pk):
    task = Task.objects.get(pk=pk)
    if request.method == 'POST':
        task.delete()
        return redirect('task_list')
    return render(request, 'tasks/task_confirm_delete.html', {'task': task})

Étape 5 : Création des formulaires

Dans tasks/forms.py :

from django import forms
from .models import Task

class TaskForm(forms.ModelForm):
    class Meta:
        model = Task
        fields = ['title', 'description', 'completed']

Étape 6 : Création des templates

Créez un répertoire templates/tasks et ajoutez les fichiers suivants :

  • task_list.html
  • task_form.html
  • task_confirm_delete.html

Étape 7 : Migrations

python manage.py makemigrations
python manage.py migrate

Étape 8 : Création des URLs

Dans tasks/urls.py :

from django.urls import path
from . import views

urlpatterns = [
    path('', views.task_list, name='task_list'),
    path('new/', views.task_create, name='task_create'),
    path('<int:pk>/edit/', views.task_update, name='task_update'),
    path('<int:pk>/delete/', views.task_delete, name='task_delete'),
]

Ajoutez ces URLs à task_manager/urls.py :

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('tasks/', include('tasks.urls')),
]

Étape 9 : Création des superutilisateurs

python manage.py createsuperuser

Erreurs frequentes et debugging

Erreur 1: AttributeError: 'User' object has no attribute 'task_set'

Cela peut se produire si vous n'avez pas correctement configuré le modèle de tâche.

## ❌ Mauvais
tasks = request.user.task_set.all()

## ✅ Correct
from .models import Task

tasks = Task.objects.filter(user=request.user)

Erreur 2: NoReverseMatch

Cela peut se produire si les noms des URL ne sont pas correctement définis.

## ❌ Mauvais
<a href="{% url 'task_list' %}">Liste de tâches</a>

## ✅ Correct
{% url 'task_list' %}

Erreur 3: TemplateDoesNotExist

Cela peut se produire si les templates ne sont pas correctement placés.

## ❌ Mauvais
{% extends 'base.html' %}

## ✅ Correct
{% extends 'tasks/base.html' %}

Pour aller plus loin

  1. Sécurité des formulaires : Utiliser CSRFToken pour prévenir les attaques CSRF.
  2. Gestion de la session utilisateur : Personnaliser le comportement de la session avec SESSION_COOKIE_AGE.
  3. Authentification sociale : Intégrer l'authentification via des services tiers comme Google ou Facebook.

Défi pratique

Créez une application simple d'API RESTful pour gérer les utilisateurs et les tâches en utilisant Django REST framework. Assurez-vous de mettre en œuvre la gestion des permissions et des autorisations.

Besoin d'aide sur Django ?

Besoin d'aide sur un projet technique ? Decrivez-le pour des conseils personnalises.

Recevoir des conseils

Questions frequentes

Comment configurer une application Django pour utiliser HTTPS ?
Pour sécuriser votre application Django, configurez un serveur web comme Nginx ou Apache en utilisant SSL/TLS et redirigez toutes les requêtes HTTP vers HTTPS. Mettez également à jour les paramètres de votre fichier settings.py en ajoutant 'SECURE_SSL_REDIRECT = True'.
Quelles mesures doivent-on prendre pour protéger contre les injections SQL dans une application Django ?
Utilisez des requêtes ORM fournies par Django qui sont préparées et sécurisées. Évitez l'utilisation directe de chaînes SQL non paramétrées et assurez-vous que toutes les entrées utilisateurs sont nettoyées avant d'être utilisées dans les requêtes.
Comment gérer les mots de passe des utilisateurs en sécurité ?
Utilisez le système de gestion de mot de passe intégré de Django qui utilise un hachage sécurisé pour stocker les mots de passe. Assurez-vous également d'activer la vérification de sécurité par rapport aux mots de passe faibles et récemment utilisés.

Pages liees

Chaque semaine, le meilleur de la tech francaise

Tendances, salaires, outils et opportunites — directement dans votre boite mail.

Gratuit. Desabonnement en un clic. Pas de spam.