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.htmltask_form.htmltask_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
- Sécurité des formulaires : Utiliser
CSRFTokenpour prévenir les attaques CSRF. - Gestion de la session utilisateur : Personnaliser le comportement de la session avec
SESSION_COOKIE_AGE. - 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.