8. Sécuriser la configuration Django en production
L'erreur la plus fréquente lors du déploiement de Django en production est de laisser DEBUG=True. En cas d'erreur, l'application expose alors à l'utilisateur la pile d'appels complète, avec les variables d'environnement et des fragments de code, ce qui constitue une fuite grave d'informations sur la structure interne de l'application.
Le SECRET_KEY utilisé par Django pour signer les sessions et les jetons doit être unique pour chaque déploiement et ne jamais figurer dans le dépôt de code. Il doit être défini comme variable d’environnement dans la configuration de l’application sur Saplo, séparément du code source.
ALLOWED_HOSTS doit contenir exactement les domaines qui donnent accès à l'application, et non un astérisque autorisant tous les hôtes. C'est une protection fondamentale contre les attaques par injection d'en-tête Host, particulièrement importante pour les applications qui reçoivent des données d'utilisateurs depuis Internet.
Il est recommandé de séparer logiquement les fichiers statiques et les médias téléversés par les utilisateurs (uploads): les fichiers statiques de l’application sont servis par nginx, tandis que les fichiers téléversés passent par un mécanisme distinct avec des permissions adaptées, afin d’éviter qu’un utilisateur puisse téléverser puis exécuter un script malveillant sur le serveur.
Les mises à jour de Django et des paquets Python utilisés (requirements.txt) doivent être régulières. Comme dans l'écosystème Node.js, les dépendances obsolètes constituent en effet un vecteur d'attaque fréquent pour des failles de sécurité connues, déjà corrigées et souvent exploitées par des scanners de vulnérabilités automatisés.
Pour les applications qui stockent des données personnelles d’utilisateurs, il est important de configurer explicitement les paramètres de session (durée d’expiration, options Secure et HttpOnly des cookies). Django les prend en charge nativement, mais ils exigent une configuration explicite dans les paramètres du projet et ne fonctionnent pas correctement avec les seules valeurs par défaut dans tous les cas. Il est recommandé d’examiner cette configuration et la liste complète des paramètres de sécurité de Django avant la première mise en production, plutôt que de découvrir un paramètre manquant après un véritable incident de sécurité.