如何在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
相关产品推荐
相关产品推荐

