django 4.2 的 queryset api 本身安全,sql 注入源于手动拼接 sql 或误用 raw()/extra()/annotate();危险操作包括 f-string 拼接 filter 参数、raw() 中字符串格式化、extra() 中引号包裹 %s 及动态表名/字段名。

Django 4.2 的 QuerySet API 本身不引入 SQL 注入漏洞,只要你不拼接字符串构造查询条件。真正危险的是绕过 QuerySet、手动拼接 SQL 或误用 raw() / extra() / annotate() 中的原始表达式。
下面直击三个最常出问题的实操点:
filter() 里别用 f-string 或 % 格式化拼参数
常见错误是把用户输入直接塞进查询字符串:
# 危险!SQL 注入入口
user_input = request.GET.get('name')
Person.objects.filter(first_name__icontains=f'%{user_input}%') # ❌ 错误示范
Django 的双下划线查询(如 __icontains)会自动参数化,但上面写法实际绕过了参数绑定——f-string 在 Python 层就完成了字符串拼接,数据库收到的是已拼好的恶意 SQL。
提供使用 django-unfold (v0.56+) 构建高级 Django 管理界面的专业指导。当用户提及 django-unfold、unfold admin 等内容时使用此技能。
- ✅ 正确做法:让 Django 处理通配符,只传纯净值
Person.objects.filter(first_name__icontains=user_input)- ✅ 模糊匹配要加前后缀?用
Q或extra()时也必须走params - ❌ 不要用
extra(where=["first_name LIKE '%%s%'"], params=[user_input])—— 单引号包裹会让params失效
raw() 调用必须带 params 参数,不能用 .format() 或 + 拼接
raw() 是原生 SQL 入口,Django 不解析语句结构,只信任 params 做安全转义。
- ✅ 安全写法:占位符用
%s(PostgreSQL/MySQL 兼容),参数走params Person.objects.raw('SELECT * FROM myapp_person WHERE first_name = %s', params=['John'])- ❌ 危险写法:
Person.objects.raw(f"SELECT * FROM ... WHERE first_name = '{user_input}'") - ❌ 同样危险:
"... WHERE first_name = '{}'".format(user_input) - ⚠️ 注意:
params是 tuple 或 list,单个值也要写成params=['value'],不是params='value'
extra() 和 annotate() 中的 raw SQL 表达式需手动防御
extra() 的 where、tables,以及 annotate() 里用 Func 或 RawSQL 构造的表达式,都可能暴露 SQL 注入面。
- ✅
RawSQL必须显式指定output_field,且参数走params RawSQL("SELECT COUNT(*) FROM logs WHERE user_id = %s", params=[user_id], output_field=IntegerField())- ✅
extra(where=...)若含变量,必须用params配合%s,且不能加引号 -
.extra(where=["status = %s"], params=['active'])✅ -
.extra(where=["status = '%s'"], params=['active'])❌(引号让 %s 变成字面量,不被替换) - ⚠️
extra(tables=...)和extra(order_by=...)**完全不支持参数化**,绝对不要动态拼表名或字段名——这些属于元数据,应白名单校验后使用
真正容易被忽略的点是:QuerySet 的惰性执行机制会掩盖问题。你写错一个 raw(),可能在模板里 {% for p in qs %} 才报错;而注入成功时甚至不报错,只是查到不该查的数据。只要涉及任何用户可控输入进入 SQL 上下文,就必须确认它是否经过了 Django 的参数化路径——而不是“看起来像 ORM 调用”就以为安全。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










