You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django中安全编写带通配符的LIKE SQL查询?

Django 安全实现 LIKE 模糊查询的正确方式

要实现带%通配符的安全LIKE查询,核心是把通配符和查询变量作为参数化内容传递,而非硬编码到SQL语句中,既能实现模糊匹配,又能彻底防范SQL注入。下面是两种可靠的实现方式:

方法一:Python 层面拼接通配符

直接在Python中把查询变量和%拼接成完整的匹配字符串,再作为参数传入参数化查询:

from django.db import connection
title = "myTitle"
query = "SELECT * FROM admin WHERE name LIKE %s"
with connection.cursor() as cursor:
     # 拼接通配符后作为参数传递
     cursor.execute(query, (f"%{title}%",))

这种方式简单直观,参数化机制会自动处理变量中的特殊字符(比如单引号、斜杠等),完全避免注入风险,数据库也能正确识别通配符完成模糊查询。

方法二:数据库层面拼接(跨数据库需适配)

利用数据库自带的字符串拼接函数,在SQL中把通配符和参数变量拼接,同样保持参数化传递:

  • 适用于MySQL/MariaDB:
from django.db import connection
title = "myTitle"
query = "SELECT * FROM admin WHERE name LIKE CONCAT('%', %s, '%')"
with connection.cursor() as cursor:
     cursor.execute(query, (title,))
  • 适用于PostgreSQL:
from django.db import connection
title = "myTitle"
query = "SELECT * FROM admin WHERE name LIKE '%' || %s || '%'"
with connection.cursor() as cursor:
     cursor.execute(query, (title,))

这种方式把通配符逻辑交给数据库处理,但需要根据使用的数据库类型调整拼接语法。

错误写法提醒

绝对不要直接把通配符写在SQL语句的占位符周围,比如:

# 错误!存在SQL注入风险
query = "SELECT * FROM admin WHERE name LIKE '%s%'"
cursor.execute(query, (title,))

这种写法会让参数化机制失效,若变量中包含特殊字符(比如' OR 1=1 --),会直接破坏SQL结构,引发注入攻击。

内容的提问来源于stack exchange,提问作者Ghost Ghaith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 17:13:27