Critical Django SQL Injection Vulnerability (CVE-2025-64459): What You Need to Know(2026-07-07)

如果您的 Django 项目正在处理用户输入——尤其是通过 QuerySet.extra()RawSQL 或自定义 annotate 表达式——那么您需要立即关注这个漏洞。CVE-2025-64459 被标记为 关键(Critical),CVSS 评分高达 9.8,这意味着攻击者可能 无需身份验证,仅通过精心构造的 URL 参数或 POST 数据,就能在您的数据库中执行任意 SQL 命令。

漏洞细节:一句话解释

简单的说,当 Django 的 QuerySet 方法在拼接用户提供的字段名或表别名时,没有严格过滤特殊字符。攻击者可以注入 UNIONDROPSELECT 等语句,进而 窃取、篡改或删除数据

受影响的版本

如果您的项目停留在 Django 3.2 或 4.1,建议立即升级至 4.2 系列的最新补丁版本

真实案例:后果有多严重?

案例一:电商网站数据泄露
某中型电商在使用 Django ORM 进行商品搜索时,使用了 Product.objects.extra(where=["name LIKE '%" + user_input + "%'"])。攻击者输入 ' UNION SELECT username, password FROM auth_user --,结果 直接导出全站用户密码哈希。该事件导致 20 万用户数据被挂暗网。

案例二:内部系统被清空
一家 SaaS 公司的后台管理面板允许管理员通过 RawSQL 过滤订单列表。攻击者利用 ; DROP TABLE orders; -- 成功删除核心交易表,导致 72 小时业务瘫痪,恢复花费超过 50 万美元。

如何修复:三步走方案

1. 立即升级 Django 版本

# 对于 Django 5.1 用户
pip install django==5.1.10

# 对于 Django 5.0 用户
pip install django==5.0.13

# 对于 Django 4.2 用户
pip install django==4.2.16

升级后重启应用,然后运行 python manage.py test 验证功能稳定性。

2. 审查所有 raw()extra() 调用

扫描代码中所有出现 .extra(, .raw(), RawSQL 的语句。基本原则:永远不要将用户输入直接拼接到 SQL 片段中。

错误写法:

Product.objects.extra(where=["name LIKE '%" + request.GET['q'] + "%'"])

正确写法(使用参数化查询):

Product.objects.extra(where=["name LIKE %s"], params=['%' + request.GET['q'] + '%'])

3. 启用数据库最小权限

即使漏洞被利用,若数据库用户只有 SELECT 权限,攻击者也无法 DROPINSERT。建议:

行动号召:今天就开始防御

  1. 立刻升级:在终端执行 pip list | grep Django 检查版本,若低于安全版本,30 分钟内完成升级
  2. 代码审计:用 grep -rn "extra\|raw\|RawSQL" your_project/ 找到所有危险调用,逐一替换为参数化查询。
  3. 设置监控:在数据库端开启审计日志,当出现 UNIONSELECT pg_sleep 等异常 SQL 模式时自动告警。

安全无小事,一次 SQL 注入足以让数月的开发成果毁于一旦。开始行动吧——您的用户数据在等着您守护。


免责声明
本文档提供的信息仅供参考,旨在帮助开发人员了解和防范 CVE-2025-64459 漏洞。作者不保证所有修复步骤的通用性,亦不对因使用或未使用此信息导致的任何直接或间接损失承担责任。请在实施安全措施前先在测试环境中验证,并咨询专业安全团队。漏洞编号和细节以 Django 官方公告(https://www.djangoproject.com/weblog/)为准