8. Django-Konfiguration für die Produktion absichern
Der häufigste Fehler beim Deployment von Django in die Produktion ist, DEBUG=True aktiv zu lassen. Bei einem Anwendungsfehler zeigt die App dann den vollständigen Stacktrace samt Umgebungsvariablen und Codefragmenten. Das ist ein schwerwiegender Informationsleck über die interne Struktur der Anwendung.
Der SECRET_KEY, den Django zum Signieren von Sessions und Tokens verwendet, sollte für jedes Deployment eindeutig sein und nicht ins Code-Repository gelangen. Er sollte ausschließlich als Umgebungsvariable in der Anwendungskonfiguration auf Saplo festgelegt werden, getrennt vom Quellcode.
ALLOWED_HOSTS sollte genau die Domains enthalten, unter denen die Anwendung erreichbar ist, und nicht den Wildcard-Eintrag * für alle Hosts. Das ist ein grundlegender Schutz gegen Host-Header-Injection und besonders wichtig bei Anwendungen, die Nutzerdaten aus dem Internet übernehmen.
Statische Dateien und von Benutzern hochgeladene Medien (Uploads) sollten logisch getrennt werden. Statische Anwendungsdateien lassen sich über nginx ausliefern, während Benutzerdateien über einen gesonderten Mechanismus mit entsprechenden Berechtigungen behandelt werden. So lässt sich verhindern, dass ein Benutzer ein bösartiges Skript auf den Server hochladen und dort ausführen kann.
Aktualisierungen von Django und verwendeten Python-Paketen (requirements.txt) sollten zur Routine gehören. Ähnlich wie im Node.js-Ökosystem sind veraltete Abhängigkeiten ein häufiger Angriffsvektor für bekannte, bereits behobene Sicherheitslücken, die automatisierte Schwachstellen-Scanner ausnutzen.
Bei Anwendungen, die personenbezogene Benutzerdaten speichern, solltest du die Sitzungseinstellungen, etwa Ablaufzeit sowie die Cookie-Flags Secure und HttpOnly, bewusst konfigurieren. Django unterstützt dies nativ, erfordert aber eine ausdrückliche Konfiguration in den Projekteinstellungen, da die Standardwerte nicht in jedem Szenario korrekt funktionieren. Prüfe diese Konfiguration vor dem ersten Produktionseinsatz zusammen mit der vollständigen Liste der Django-Sicherheitseinstellungen, statt eine fehlende Einstellung erst nach einem echten Sicherheitsvorfall zu entdecken.