Django安全最佳实践 - 防护常见Web安全漏洞
📂 所属阶段:第三部分 — 高级主题
🎯 难度等级:高级
⏰ 预计学习时间:3-4小时
🎒 前置知识:用户认证系统
目录
安全概述
Web安全是开发的核心红线,Django内置了多层防护机制,但需要正确配置才能生效。
OWASP Top 5(Django直接/间接防护)
- 注入(Injection):ORM防SQL,模板转义防XSS
- 失效的访问控制:装饰器、权限系统
- 身份验证失败:认证中间件、密码验证器
- 安全配置错误:内置
check --deploy检查 - CSRF:原生CSRF中间件
核心安全原则
- 最小权限:只给必要权限,避免超级用户操作
- 输入白名单,输出全转义:拒绝模糊匹配,输出必须过滤
- 深度防御:一层破了还有下一层
- 不暴露敏感信息:错误页面、日志要脱敏
XSS防护
XSS(跨站脚本)是最常见的攻击之一,Django默认防住了大部分。
1. 模板自动转义(核心防护)
Django模板引擎默认转义所有HTML特殊字符,不要随便禁用。
随意使用|safe过滤器会暴露XSS漏洞:
2. 富文本清理(用bleach)
如果必须允许用户输入富文本,用Django生态常用的bleach库(不是自己写正则)。
首先安装:
然后自定义模板过滤器:
模板中使用:
3. 内容安全策略(CSP)
CSP是浏览器端的最后一道防线,通过HTTP头限制资源加载。
在settings.py的中间件列表开头(或Gunicorn/Nginx配置)添加:
更严格的CSP可以通过自定义简单中间件或Nginx配置。
CSRF防护
CSRF(跨站请求伪造)利用用户的登录状态发起恶意请求,Django原生中间件防住了99%的情况。
1. 原生中间件(默认开启)
不要删除django.middleware.csrf.CsrfViewMiddleware。
2. 模板中使用CSRF令牌
所有表单必须包含{% csrf_token %}:
3. AJAX请求携带令牌
Axios(推荐):
4. 关键settings配置
SQL注入防护
SQL注入利用拼接的SQL语句执行恶意查询,Django ORM是核心防护。
1. 禁止拼接SQL
2. 正确使用ORM
其他核心安全防护
1. 点击劫持防护
Django内置XFrameOptionsMiddleware(默认开启),禁止/限制页面在iframe中显示。
2. 文件上传安全
文件上传是高危操作,必须三重验证:
- 扩展名白名单
- MIME类型验证
- 图片完整性检查(如果是图片)
用Django表单实现:
3. 密码安全
Django内置了强密码验证器,生产环境必须启用:
生产环境安全配置
1. 核心环境变量(用python-decouple)
不要把敏感信息写在代码里,用python-decouple从.env读取:
.env文件(不要提交到Git):
settings.py:
2. 生产环境一键配置(用check --deploy)
运行Django内置的部署安全检查:
根据提示修正所有问题。
安全测试与工具
1. 基础测试用例
2. 常用安全工具
- Bandit:静态代码安全扫描
- Safety:检查依赖包漏洞
本章小结
- Django默认防住了大部分漏洞,但需要正确配置
- 输入白名单,输出全转义是核心
- 禁止SQL拼接,必须用ORM或参数化查询
- 生产环境必须关闭DEBUG,启用HTTPS
- 定期用安全工具扫描,运行check --deploy
下一步学习
🔗 相关教程推荐
🏷️ 核心标签:Django安全 XSS防护 CSRF防护 SQL注入 生产环境配置

