如何在SQL LIKE的用户输入中转义特殊字符?

时间:2011-04-13 11:26:44

标签: sql sql-server code-injection

采用以下示例(SQL Server 2008 - 可能更多)。你必须想象@query是一个参数,其来源是用户输入:

DECLARE @query varchar(100)
SET @query = 'less than 1% fat'

CREATE TABLE X ([A] VARCHAR(100))
INSERT X VALUES ('less than 1% fat')
INSERT X VALUES ('less than 1% of doctors recommend this - it''s full of fat!')
SELECT * FROM X WHERE A LIKE '%' + @query + '%'
DROP TABLE X

查询说明了'less than 1% fat',但实际上我们获得了超出我们想要的内容:

less than 1% fat
less than 1% of doctors recommend this - it's full of fat!

要获得所需的行为,我将@query更改为'less than 1[%] fat' - 然后只返回第一个结果。

是否有标准方法为使用LIKE s的子句准备字符串,还是我必须自己滚动?

2 个答案:

答案 0 :(得分:6)

您可以使用自由文本搜索和CONTAINSFREETEXT谓词,而不是使用LIKE。 LIKE使用前导通配符忽略索引并导致全表扫描,而全文搜索使用现有的自由文本索引来加速搜索。您必须先配置free text indexing才能使用它。

如果你想坚持使用LIKE,最好的解决办法就是逃避客户端代码中的字符串。 T-SQL提供非常有限的字符串操作功能,REPLACE函数甚至不接受通配符。您必须嵌套多个REPLACE语句以考虑LIKE使用的所有通配符。

如果您的搜索字符串可能包含[或]字符,您可以将它与ESCAPE子句组合使用,例如§,¶或¤等稀有字符作为转义字符。

答案 1 :(得分:6)

SQL Server允许您指定escape character,然后您可以在使用之前转义查询字符串。

我链接的MSDN页面中的示例:

SELECT c1 
FROM mytbl2
WHERE c1 LIKE '%10-15!% off%' ESCAPE '!';