一、技能概述
该技能为 Django 应用提供了一套系统化的安全实践指南,从生产环境配置到部署运维,覆盖了 Django 服务的各个安全维度。
适用场景:设置 Django 认证和授权、配置生产环境安全设置、审查 Django 应用安全问题、将 Django 应用部署到生产环境。
核心原则:安全是一个过程,而非产品——定期审查并更新安全实践。
二、核心功能
1. 生产环境安全配置
| 配置项 | 推荐值 | 说明 |
|---|---|---|
DEBUG |
False |
切勿在生产环境中启用 |
ALLOWED_HOSTS |
环境变量列表 | 限制允许访问的主机 |
SECURE_SSL_REDIRECT |
True |
强制 HTTPS 重定向 |
SECURE_HSTS_SECONDS |
31536000 |
1 年 HSTS |
SESSION_COOKIE_SECURE / CSRF_COOKIE_SECURE |
True |
Cookie 仅通过 HTTPS 传输 |
X_FRAME_OPTIONS |
'DENY' |
防止点击劫持 |
SECURE_CONTENT_TYPE_NOSNIFF |
True |
防止 MIME 类型嗅探 |
SECRET_KEY 必须通过环境变量设置,不得硬编码或提交到版本控制。
2. 密码验证
启用 Django 所有内置密码验证器,要求密码长度不少于 12 位:
-
UserAttributeSimilarityValidator—— 防止密码与用户属性相似 -
MinimumLengthValidator—— 最小长度 12 位 -
CommonPasswordValidator—— 防止使用常见弱密码 -
NumericPasswordValidator—— 防止纯数字密码
3. 认证
自定义用户模型:使用邮箱作为用户名,增强安全性:
class User(AbstractUser):
email = models.EmailField(unique=True)
USERNAME_FIELD = 'email' # 使用邮箱作为登录凭证
密码哈希:优先使用 Argon2 等更强的哈希算法:
PASSWORD_HASHERS = [
'django.contrib.auth.hashers.Argon2PasswordHasher', # 最安全
'django.contrib.auth.hashers.PBKDF2PasswordHasher',
]
会话管理:配置缓存会话引擎、Cookie 有效期和 SameSite 属性。
4. 授权
模型级权限:在 Meta.permissions 中自定义权限:
class Meta:
permissions = [
('can_publish', 'Can publish posts'),
('can_edit_others', 'Can edit posts of others'),
]
视图级权限:使用 LoginRequiredMixin 和 PermissionRequiredMixin 保护视图。
自定义权限:为 DRF API 创建 IsOwnerOrReadOnly、IsAdminOrReadOnly 等自定义权限类。
基于角色的访问控制(RBAC):在用户模型中定义角色字段(admin/moderator/user),并创建对应的 Mixin。
5. SQL 注入防护
Django ORM 默认自动转义参数,是安全的:
User.objects.get(username=username) # 安全
使用 raw() 执行原生 SQL 时,必须使用参数绑定,绝不拼接字符串:
# 安全
User.objects.raw('SELECT * FROM users WHERE username = %s', [query])
# ❌ 危险——SQL 注入漏洞
User.objects.raw(f'SELECT * FROM users WHERE username = {username}')
使用 Q 对象构建复杂查询时同样安全。
6. XSS 防护
Django 模板默认自动转义变量:
{{ user_input }} {# 自动转义 HTML #}
安全实践:
-
仅在处理可信 HTML 时使用
|safe过滤器 -
使用
|striptags移除所有 HTML 标签 -
使用
format_html安全地构建包含变量的 HTML -
绝不直接对用户输入使用
mark_safe
7. CSRF 防护
Django 默认启用 CSRF 防护:
-
CSRF_COOKIE_SECURE = True—— 仅通过 HTTPS 传输 -
CSRF_COOKIE_HTTPONLY = True—— 防止 JavaScript 访问 -
CSRF_COOKIE_SAMESITE = 'Lax'
模板中使用 {% csrf_token %},AJAX 请求中通过 Cookie 获取 CSRF Token 并放入请求头。
谨慎使用 @csrf_exempt:仅在绝对必要时(如外部 Webhook)才豁免。
8. 文件上传安全
文件验证:验证文件扩展名(白名单)和文件大小(最大 5MB):
valid_extensions = ['.jpg', '.jpeg', '.png', '.gif', '.pdf']
if filesize > 5 * 1024 * 1024:
raise ValidationError('File too large.')
安全存储:
-
将媒体文件存储在 Web 根目录之外
-
生产环境使用独立域名或 CDN(如 S3)提供媒体文件服务
9. API 安全
速率限制:区分匿名用户和认证用户的限流策略:
DEFAULT_THROTTLE_RATES = {
'anon': '100/day',
'user': '1000/day',
'upload': '10/hour',
}
API 认证:使用 TokenAuthentication 或 JWT:
DEFAULT_AUTHENTICATION_CLASSES = [
'rest_framework.authentication.TokenAuthentication',
'rest_framework_simplejwt.authentication.JWTAuthentication',
]
使用 @permission_classes([IsAuthenticated]) 保护 API 视图。
10. 安全标头
内容安全策略(CSP):限制脚本、样式、图片等资源的加载来源:
CSP_DEFAULT_SRC = "'self'"
CSP_SCRIPT_SRC = "'self' https://cdn.example.com"
通过自定义中间件添加安全标头:
-
X-Content-Type-Options: nosniff -
X-Frame-Options: DENY -
X-XSS-Protection: 1; mode=block
11. 密钥管理
使用 python-decouple 或 django-environ 从 .env 文件读取敏感配置:
SECRET_KEY = env('DJANGO_SECRET_KEY')
DATABASE_URL = env('DATABASE_URL')
ALLOWED_HOSTS = env.list('ALLOWED_HOSTS')
.env 文件绝不提交到版本控制。
12. 安全事件日志
配置日志记录器捕获 django.security 和 django.request 事件:
'loggers': {
'django.security': {
'handlers': ['file', 'console'],
'level': 'WARNING',
},
}
三、快速安全检查清单
| 检查项 | 说明 |
|---|---|
DEBUG = False |
切勿在生产环境中启用 DEBUG |
| 仅限 HTTPS | 强制 SSL,使用安全 Cookie |
| 强密钥 | 对 SECRET_KEY 使用环境变量 |
| 密码验证 | 启用所有密码验证器 |
| CSRF 防护 | 默认启用,不要禁用 |
| XSS 防护 | Django 自动转义,不要在用户输入上使用 |safe |
| SQL 注入 | 使用 ORM,切勿在查询中拼接字符串 |
| 文件上传 | 验证文件类型和大小 |
| 速率限制 | 限制 API 端点访问频率 |
| 安全头部 | CSP、X-Frame-Options、HSTS |
| 日志记录 | 记录安全事件 |
| 更新 | 保持 Django 及其依赖项为最新版本 |
四、主要用途
-
新项目安全基线 —— Django 项目初始化时建立完整安全防护体系
-
生产环境部署前检查 —— 逐项确认
DEBUG=False、HTTPS 强制、密钥外部化等关键配置 -
安全审计与代码审查 —— 对照清单检查认证、授权、CSRF、XSS、SQL 注入等常见漏洞
-
API 安全加固 —— 配置速率限制、认证机制和权限控制
-
团队安全培训 —— 作为 Django 开发团队的安全编码规范参考文档
五、重要原则
-
DEBUG 永不开启:生产环境
DEBUG必须为False -
密钥不入库:
SECRET_KEY通过环境变量注入,绝不提交到版本控制 -
默认拒绝:使用
LoginRequiredMixin和权限类保护敏感视图 -
参数化查询:使用原生 SQL 时必须使用参数绑定,绝不拼接字符串
-
自动转义优先:Django 模板默认转义,仅在处理可信内容时使用
|safe -
CSRF 保持启用:不要轻易使用
@csrf_exempt -
文件上传验证:验证文件类型(白名单)和大小
-
速率限制必配:所有 API 端点应配置速率限制
-
日志脱敏:确保日志中不记录密码、Token 等敏感信息
-
定期更新:保持 Django 及所有依赖为最新版本
六、总结
Django Security 是一套完整的 Django 应用安全最佳实践技能,覆盖生产环境配置、认证授权、SQL 注入防护、XSS 防护、CSRF 防护、文件上传安全、API 速率限制、安全标头、密钥管理和安全事件日志等 12 个核心安全领域。它提供了清晰的代码示例和逐项验证的快速安全检查清单,适用于新项目安全基线、生产部署前检查、代码审计和团队安全培训等场景。该技能源自 ECC 项目,强调“安全是一个过程,而非产品”。