like本身不注入,但用户输入含未转义的%、_、[、]、-、^会导致语义错乱;方括号无法安全处理-和^,唯一通用方式是用escape指定转义符并逐个转义特殊字符。

LIKE 子句本身不会“注入”,但若用户输入直接拼入 LIKE 模式且含未转义的 %、_、[、]、-、^,就会导致语义错乱或意外匹配——这属于逻辑漏洞,不是 SQL 注入,但危害类似。
为什么不能只靠方括号 [] 包裹所有特殊字符
方括号能安全包裹 %、_、[、],比如 '[%]' 匹配字面量 %,'[[]' 匹配 [。但 - 和 ^ 在 [] 内有特殊含义(范围分隔符、取反),若写成 '[^A-Z]' 是“非 A–Z”,而你想匹配字面量 ^ 或 -,就必须用 ESCAPE。
-
LIKE 'a[-]b'会报错:SQL Server 把-当作范围操作符,但前后没字符定义范围 -
LIKE 'a[^\]b'中^若不在开头,就不是取反含义,但行为不可靠,不推荐依赖 - 唯一通用、明确、可读的方式是统一用
ESCAPE指定一个转义符,再对所有待匹配的特殊字符加该前缀
如何正确使用 ESCAPE 子句匹配字面量通配符
核心规则:在 LIKE 模式中,把转义符(任意单字符)放在目标特殊字符前,再用 ESCAPE 'x' 声明该字符为转义符。SQL Server 就不再将紧随其后的 %、_、[、]、-、^ 当作通配符解析。
- 想查含
5%的字符串:WHERE col LIKE '%5!%%' ESCAPE '!'——中间的!转义了它后面的%,最后的%仍是通配符 - 想查以
_test开头的值:WHERE col LIKE '!_test%' ESCAPE '!' - 想查含
[abc]字串:WHERE col LIKE '%![abc]%' ESCAPE '!'(注意:这里[abc]是字面量,不是字符类) - 转义符本身也可出现在模式里:要查字面量
!,写成'!!',因为第一个!是转义符,第二个才是被转义的字符
实际场景中容易踩的坑
真实业务里,用户搜索词常含 %、_,甚至手动输入 [ 或 ]。若不做处理,WHERE name LIKE '%' + @input + '%' 会导致结果爆炸或漏匹配。
- 不要对整个
@input加ESCAPE,而是先转义其中的特殊字符,再拼进模式。例如 C# 中:input.Replace("!", "!!").Replace("%", "!%").Replace("_", "!_").Replace("[", "









