8. Segurança da configuração do Django em produção
O erro mais comum ao implementar o Django em produção é esquecer de desativar DEBUG=True. Em caso de erro da aplicação, esta configuração mostra ao utilizador o rastreio completo da pilha, incluindo variáveis de ambiente e fragmentos de código, o que representa uma grave divulgação de informação sobre a estrutura interna da aplicação.
O SECRET_KEY usado pelo Django para assinar sessões e tokens deve ser único para cada implantação e não deve constar no repositório de código, mas sim ser definido como uma variável de ambiente na configuração da aplicação na Saplo, à parte do próprio código-fonte.
O ALLOWED_HOSTS deve conter exatamente os domínios nos quais a aplicação está acessível, e não um asterisco que represente todos os hosts. Esta é uma proteção básica contra ataques de injeção no cabeçalho Host, especialmente importante em aplicações que recebem dados dos utilizadores da Internet.
Vale a pena separar logicamente os ficheiros estáticos dos ficheiros de media enviados pelos utilizadores (uploads), servindo os ficheiros estáticos da aplicação através do nginx e os ficheiros carregados pelos utilizadores através de um mecanismo separado com as permissões adequadas. Assim, evita-se que um utilizador carregue e execute um script malicioso no servidor.
As atualizações do próprio Django e dos pacotes Python utilizados (requirements.txt) devem fazer parte da manutenção regular, porque, tal como no ecossistema Node.js, as dependências desatualizadas são um vetor frequente de vulnerabilidades de segurança conhecidas e já corrigidas, exploradas por scanners automatizados de vulnerabilidades.
Em aplicações que armazenam dados pessoais dos utilizadores, vale a pena configurar deliberadamente as definições de sessão, como o tempo de expiração e as flags Secure e HttpOnly dos cookies. O Django suporta esta configuração nativamente, mas exige uma configuração explícita nas definições do projeto, e a configuração não é adequada com os valores predefinidos em todos os cenários. Convém rever esta configuração, juntamente com a lista completa das definições de segurança do Django, antes da primeira implantação em produção, em vez de descobrir uma definição em falta só depois de um incidente real de segurança.