Python中Django安全开发的最佳实践与干货分享
上个礼拜根据我们公司项目 Pwnhub 的技术栈(大概涉及到 Django 、 DjangoRestFramework 、 Vue 、 API 通信、微信公众号、 Docker 等方面的安全开发),写的一篇文章。
https://zhuanlan.zhihu.com/p/26134332
“绝对不是干货”![doge]
Python中Django安全开发的最佳实践与干货分享
写的挺好的。
帖子回复:
Django本身提供了强大的安全基础,但正确使用这些机制是关键。以下是一些核心的安全实践:
-
永远使用Django模板系统:它会自动转义HTML、JS和CSS,这是防止XSS攻击的第一道防线。除非绝对必要且有把握,否则不要使用
|safe过滤器或mark_safe。 -
CSRF保护必须开启:确保所有修改数据的POST、PUT、PATCH、DELETE请求都通过
{% csrf_token %}模板标签或设置相应的请求头(如API场景)进行保护。这是Django默认的,别关掉它。 -
用户输入验证与清理:
- 表单:坚持使用Django的
Form或ModelForm类。它们能自动处理验证和清理。 - ORM查询:永远使用参数化查询(Django ORM自动处理),绝对不要用字符串拼接来构建SQL。
# 错误做法(有SQL注入风险) User.objects.raw(f"SELECT * FROM auth_user WHERE username = '{username}'") # 正确做法(Django ORM自动防护) User.objects.filter(username=username)- 直接执行原生SQL:如果必须用
raw()或extra(),要格外小心,手动使用参数化。
# 正确做法(使用参数化) User.objects.raw('SELECT * FROM auth_user WHERE username = %s', [username]) - 表单:坚持使用Django的
-
安全的密码管理:
- 使用
django.contrib.auth中的User模型,它默认使用PBKDF2算法。 - 创建用户时用
create_user()(会哈希密码),而不是create()。 - 检查密码用
check_password()。
- 使用
-
敏感信息保护:
- 密钥、数据库密码等必须放在环境变量中,绝不能硬编码在代码里。使用
python-decouple或django-environ来管理。 - 生产环境务必设置
DEBUG = False,并正确配置ALLOWED_HOSTS。
- 密钥、数据库密码等必须放在环境变量中,绝不能硬编码在代码里。使用
-
文件上传:
- 限制上传文件的类型(检查
content_type和文件扩展名)。 - 将上传的文件存储在非Web根目录下,并通过视图提供访问(而不是直接暴露URL)。
- 考虑使用
Pillow验证上传的图片。
- 限制上传文件的类型(检查
-
会话安全:
- 使用
SESSION_COOKIE_SECURE = True(仅HTTPS)。 - 使用
SESSION_COOKIE_HTTPONLY = True(防止JS访问)。 - 考虑设置较短的会话过期时间。
- 使用
-
点击劫持防护:确保
django.middleware.clickjacking.XFrameOptionsMiddleware中间件启用(默认是启用的)。 -
依赖包安全:定期用
pip-audit或safety检查项目依赖的已知漏洞。 -
安全相关的中间件和设置:确保
SecurityMiddleware启用(默认),它会设置一些安全相关的HTTP头。
总结: 遵循Django的“约定优于配置”,别绕过它的安全机制,你就已经躲过了大部分常见漏洞。
p 神在 v 站的帖子居然没人顶
我的程序员之路还需继续努力
哪有_(:з」∠)_
m
写的不错,赞
不错
沾沾喜气

