Django 生产环境安全配置是项目上线前必须完成的检查。Django 自带了 check --deploy 命令来帮助开发者快速识别常见的安全配置遗漏,上线前建议先执行一次,再逐项处理提示。
如果你是 Django 新手入门,建议先了解 Django 调试工具对比:debug-toolbar 与 silk,在开发阶段就养成良好的安全习惯。同时也要注意 Django 日期聚合查询的时区坑,生产环境中时区配置不当同样会引发安全问题。
Django 生产环境安全:运行部署检查
python manage.py check --deploy这个命令会扫描 settings.py 并列出所有不符合生产环境安全要求的配置。它检查的内容涵盖以下所有关键项。
关闭 DEBUG 模式
生产环境必须将 DEBUG 设为 False。开启时会暴露详细的错误堆栈、SQL 查询和服务器路径,攻击者可以利用这些信息进行进一步渗透。
DEBUG = False同时记得配置 ADMINS 和 SERVER_EMAIL,让 500 错误通过邮件通知维护人员:
ADMINS = [('Admin', 'admin@example.com')]
SERVER_EMAIL = 'noreply@example.com'强制 HTTP 跳转 HTTPS
SECURE_SSL_REDIRECT = True如果 Django 部署在 Nginx、负载均衡器或其他反向代理后面,需要告诉 Django 哪个请求头代表 HTTPS 协议:
SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")这条配置是反向代理架构下 Django 官方推荐的做法,否则 SECURE_SSL_REDIRECT 会导致无限重定向循环。
Cookie 安全设置
HTTPS 站点应确保 Cookie 只通过加密通道传输,这是 Django 生产环境安全的基础环节,防止中间人窃取会话:
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True如果希望 Cookie 不被 JavaScript 读取(防御 XSS 窃取),可以加上 HttpOnly:
SESSION_COOKIE_HTTPONLY = TrueHSTS(HTTP 严格传输安全)
告诉浏览器始终使用 HTTPS 访问本站,防止 SSL 剥离攻击:
SECURE_HSTS_SECONDS = 31536000 # 一年
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True注意:设置 SECURE_HSTS_SECONDS 后,在过期前无法降级回 HTTP。建议先从小值开始测试,确认无误后再改为一年。详见 HSTS 官方文档。
安全响应头
Django 提供了一组中间件来添加安全相关的 HTTP 头:
SECURE_BROWSER_XSS_FILTER = True # X-XSS-Protection
SECURE_CONTENT_TYPE_NOSNIFF = True # X-Content-Type-Options: nosniff
X_FRAME_OPTIONS = 'DENY' # X-Frame-Options,防止点击劫持ALLOWED_HOSTS
生产环境必须配置允许的域名列表,否则 Django 会拒绝所有请求。这是 防止 HTTP Host 头攻击 的第一道防线:
ALLOWED_HOSTS = ['www.kuddy.cn', 'kuddy.cn', '127.0.0.1']数据库与密钥安全
Django 生产环境安全的另一个重点是凭据管理。以下三项永远不要硬编码在代码中:
SECRET_KEY— 用于会话签名、CSRF Token、密码重置等核心安全机制- 数据库密码
- 第三方 API Key
推荐做法是通过环境变量或 .env 文件注入:
import os
SECRET_KEY = os.environ['DJANGO_SECRET_KEY']
DATABASES['default']['PASSWORD'] = os.environ['DB_PASSWORD']CSRF 保护
Django 默认启用 CsrfViewMiddleware,生产环境中不要关闭。如果使用前后端分离架构(API 与前端不同源),可能需要配置 CSRF_TRUSTED_ORIGINS:
CSRF_TRUSTED_ORIGINS = ['https://www.kuddy.cn']安全日志与监控
生产环境应记录安全相关事件,方便事后追溯:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'security_file': {
'level': 'WARNING',
'class': 'logging.FileHandler',
'filename': '/var/log/django/security.log',
},
},
'loggers': {
'django.security': {
'handlers': ['security_file'],
'level': 'WARNING',
'propagate': True,
},
},
}总结
以上配置覆盖了 Django 官方部署检查清单 的核心项。每次上线或重大变更后都建议重新执行 check --deploy,确保没有遗漏。
