Python中Django安全开发的最佳实践与干货分享

上个礼拜根据我们公司项目 Pwnhub 的技术栈(大概涉及到 Django 、 DjangoRestFramework 、 Vue 、 API 通信、微信公众号、 Docker 等方面的安全开发),写的一篇文章。

https://zhuanlan.zhihu.com/p/26134332

“绝对不是干货”![doge]


Python中Django安全开发的最佳实践与干货分享

9 回复

写的挺好的。


帖子回复:

Django本身提供了强大的安全基础,但正确使用这些机制是关键。以下是一些核心的安全实践:

  1. 永远使用Django模板系统:它会自动转义HTML、JS和CSS,这是防止XSS攻击的第一道防线。除非绝对必要且有把握,否则不要使用|safe过滤器或mark_safe

  2. CSRF保护必须开启:确保所有修改数据的POST、PUT、PATCH、DELETE请求都通过{% csrf_token %}模板标签或设置相应的请求头(如API场景)进行保护。这是Django默认的,别关掉它。

  3. 用户输入验证与清理

    • 表单:坚持使用Django的FormModelForm类。它们能自动处理验证和清理。
    • 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])
    
  4. 安全的密码管理

    • 使用django.contrib.auth中的User模型,它默认使用PBKDF2算法。
    • 创建用户时用create_user()(会哈希密码),而不是create()
    • 检查密码用check_password()
  5. 敏感信息保护

    • 密钥、数据库密码等必须放在环境变量中,绝不能硬编码在代码里。使用python-decoupledjango-environ来管理。
    • 生产环境务必设置DEBUG = False,并正确配置ALLOWED_HOSTS
  6. 文件上传

    • 限制上传文件的类型(检查content_type和文件扩展名)。
    • 将上传的文件存储在非Web根目录下,并通过视图提供访问(而不是直接暴露URL)。
    • 考虑使用Pillow验证上传的图片。
  7. 会话安全

    • 使用SESSION_COOKIE_SECURE = True(仅HTTPS)。
    • 使用SESSION_COOKIE_HTTPONLY = True(防止JS访问)。
    • 考虑设置较短的会话过期时间。
  8. 点击劫持防护:确保django.middleware.clickjacking.XFrameOptionsMiddleware中间件启用(默认是启用的)。

  9. 依赖包安全:定期用pip-auditsafety检查项目依赖的已知漏洞。

  10. 安全相关的中间件和设置:确保SecurityMiddleware启用(默认),它会设置一些安全相关的HTTP头。

总结: 遵循Django的“约定优于配置”,别绕过它的安全机制,你就已经躲过了大部分常见漏洞。

p 神在 v 站的帖子居然没人顶

我的程序员之路还需继续努力

哪有_(:з」∠)_

写的不错,赞

沾沾喜气

回到顶部