Django安全技能

85 0 更新时间: 2026-07-15 14:55:54

Django安全技能是ECC项目中的一项专业技能,专注于帮助开发者在使用Django框架时确保应用程序的安全性。该技能涵盖了常见的Web安全威胁防护,如跨站脚本攻击(XSS)、SQL注入、跨站请求伪造(CSRF)、点击劫持等,并提供最佳实践指南。适用于所有使用Django构建Web应用的开发团队,特别是需要强化安全防护的企业级项目。通过集成该技能,开发者可以快速识别和修复安全漏洞,提升整体应用的安全等级。

安装
bunx skills add https://github.com/affaan-m/ECC.git --skill django-security
技能详情 readonly

一、技能概述

该技能为 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. 认证

自定义用户模型:使用邮箱作为用户名,增强安全性:

python
class User(AbstractUser):
    email = models.EmailField(unique=True)
    USERNAME_FIELD = 'email'  # 使用邮箱作为登录凭证

密码哈希:优先使用 Argon2 等更强的哈希算法:

python
PASSWORD_HASHERS = [
    'django.contrib.auth.hashers.Argon2PasswordHasher',  # 最安全
    'django.contrib.auth.hashers.PBKDF2PasswordHasher',
]

会话管理:配置缓存会话引擎、Cookie 有效期和 SameSite 属性。

4. 授权

模型级权限:在 Meta.permissions 中自定义权限:

python
class Meta:
    permissions = [
        ('can_publish', 'Can publish posts'),
        ('can_edit_others', 'Can edit posts of others'),
    ]

视图级权限:使用 LoginRequiredMixin 和 PermissionRequiredMixin 保护视图。

自定义权限:为 DRF API 创建 IsOwnerOrReadOnlyIsAdminOrReadOnly 等自定义权限类。

基于角色的访问控制(RBAC):在用户模型中定义角色字段(admin/moderator/user),并创建对应的 Mixin。

5. SQL 注入防护

Django ORM 默认自动转义参数,是安全的:

python
User.objects.get(username=username)  # 安全

使用 raw() 执行原生 SQL 时,必须使用参数绑定,绝不拼接字符串:

python
# 安全
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 模板默认自动转义变量:

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):

python
valid_extensions = ['.jpg', '.jpeg', '.png', '.gif', '.pdf']
if filesize > 5 * 1024 * 1024:
    raise ValidationError('File too large.')

安全存储

  • 将媒体文件存储在 Web 根目录之外

  • 生产环境使用独立域名或 CDN(如 S3)提供媒体文件服务

9. API 安全

速率限制:区分匿名用户和认证用户的限流策略:

python
DEFAULT_THROTTLE_RATES = {
    'anon': '100/day',
    'user': '1000/day',
    'upload': '10/hour',
}

API 认证:使用 TokenAuthentication 或 JWT:

python
DEFAULT_AUTHENTICATION_CLASSES = [
    'rest_framework.authentication.TokenAuthentication',
    'rest_framework_simplejwt.authentication.JWTAuthentication',
]

使用 @permission_classes([IsAuthenticated]) 保护 API 视图。

10. 安全标头

内容安全策略(CSP):限制脚本、样式、图片等资源的加载来源:

python
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 文件读取敏感配置:

python
SECRET_KEY = env('DJANGO_SECRET_KEY')
DATABASE_URL = env('DATABASE_URL')
ALLOWED_HOSTS = env.list('ALLOWED_HOSTS')

.env 文件绝不提交到版本控制。

12. 安全事件日志

配置日志记录器捕获 django.security 和 django.request 事件:

python
'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 及其依赖项为最新版本

四、主要用途

  1. 新项目安全基线 —— Django 项目初始化时建立完整安全防护体系

  2. 生产环境部署前检查 —— 逐项确认 DEBUG=False、HTTPS 强制、密钥外部化等关键配置

  3. 安全审计与代码审查 —— 对照清单检查认证、授权、CSRF、XSS、SQL 注入等常见漏洞

  4. API 安全加固 —— 配置速率限制、认证机制和权限控制

  5. 团队安全培训 —— 作为 Django 开发团队的安全编码规范参考文档


五、重要原则

  1. DEBUG 永不开启:生产环境 DEBUG 必须为 False

  2. 密钥不入库SECRET_KEY 通过环境变量注入,绝不提交到版本控制

  3. 默认拒绝:使用 LoginRequiredMixin 和权限类保护敏感视图

  4. 参数化查询:使用原生 SQL 时必须使用参数绑定,绝不拼接字符串

  5. 自动转义优先:Django 模板默认转义,仅在处理可信内容时使用 |safe

  6. CSRF 保持启用:不要轻易使用 @csrf_exempt

  7. 文件上传验证:验证文件类型(白名单)和大小

  8. 速率限制必配:所有 API 端点应配置速率限制

  9. 日志脱敏:确保日志中不记录密码、Token 等敏感信息

  10. 定期更新:保持 Django 及所有依赖为最新版本


六、总结

Django Security 是一套完整的 Django 应用安全最佳实践技能,覆盖生产环境配置、认证授权、SQL 注入防护、XSS 防护、CSRF 防护、文件上传安全、API 速率限制、安全标头、密钥管理和安全事件日志等 12 个核心安全领域。它提供了清晰的代码示例和逐项验证的快速安全检查清单,适用于新项目安全基线、生产部署前检查、代码审计和团队安全培训等场景。该技能源自 ECC 项目,强调“安全是一个过程,而非产品”。