我目前正在使用这样的查询(使用JDBC)搜索我的数据库:
"... AND LCASE(Items.Name) LIKE '%" + searchString.toLowerCase() + "%';"
现在,这显然非常糟糕,因为它允许SQL注入以及插入通配符,例如%和_。
我的问题是,如何进行查询,即使searchString包含任何这些字符,它们也会被字面上对待?
答案 0 :(得分:6)
首先,不要将LCASE
与LIKE
一起使用,除非您使用区分大小写的区域设置(这不是MySQL的默认区域设置)。
就转义这些字符而言,只需在其前面添加\
字符,因此foo%bar
变为foo\%bar
。
(自从我使用Java以来已经有一段时间了,但这可能有用:)
searchString.replaceAll('%', '\\\\%').replaceAll('_', '\\\\_')
(或使用正则表达式):
Regex r = new Regex('(?:%|_)', '\\\\$&');
r.replaceAll(searchString)
就防止SQL注入而言,只需将变量绑定为正常:
WHERE LCASE(Items.Name) LIKE ?
并创建绑定字符串,如:
'%' + searchString.replaceAll('%', '\\\\%').replaceAll('_', '\\\\_') + '%'
答案 1 :(得分:1)
根据this,您可以使用斜杠(\
)或指定自己的转义字符来转义它们:
"... AND LCASE(Items.Name) LIKE '%" + searchString.toLowerCase() + "%' ESCAPE '/';"
您必须搜索并替换您的语言(Java?),LIKE
和%
中的mysql _
通配符符号,并将其替换为{{1}分别和\%
。您上面提到的其他模式匹配不是(根据链接的文档)支持。