8. Sicurezza della configurazione di Django in produzione
L'errore più comune nel distribuire Django in produzione è lasciare attivo DEBUG=True: in caso di errore, l'app mostra all'utente l'intero stack trace insieme alle variabili d'ambiente e a frammenti di codice, causando una grave fuga di informazioni sulla struttura interna dell'app.
Il SECRET_KEY usato da Django per firmare sessioni e token dovrebbe essere unico per ogni deployment. Non deve finire nel repository del codice, ma essere impostato come variabile d'ambiente nella configurazione dell'applicazione su Saplo, separatamente dal codice sorgente.
ALLOWED_HOSTS deve contenere esattamente i domini in cui l'app è disponibile, non un asterisco che ammette tutti gli host: è la protezione di base contro gli attacchi di Host header injection, particolarmente importante per le app che ricevono dati da utenti su internet.
Conviene separare logicamente i file statici dai media caricati dagli utenti (uploads), gestendo i file statici dell'applicazione tramite nginx e i file caricati dagli utenti tramite un meccanismo separato con autorizzazioni adeguate, per evitare che un utente possa caricare ed eseguire uno script dannoso sul server.
Gli aggiornamenti di Django e dei pacchetti Python utilizzati (requirements.txt) dovrebbero essere una pratica regolare: come nell'ecosistema Node.js, le dipendenze obsolete sono un vettore d'attacco frequente per vulnerabilità note e già corrette, sfruttate dagli scanner automatici di vulnerabilità.
Per le applicazioni che conservano dati personali degli utenti è importante configurare consapevolmente le impostazioni di sessione (tempo di scadenza, flag Secure e HttpOnly dei cookie). Django le supporta nativamente, ma richiede una configurazione esplicita nelle impostazioni del progetto: i soli valori predefiniti non bastano in ogni scenario. Vale la pena esaminare questa configurazione insieme all'elenco completo delle impostazioni di sicurezza di Django prima del primo deployment in produzione, anziché scoprire un'impostazione mancante solo dopo un vero incidente di sicurezza.