Dan*_*bbs 2 mysql search escaping jdbc wildcard
我目前正在使用这样的查询(使用JDBC)搜索我的数据库:
"... AND LCASE(Items.Name) LIKE '%" + searchString.toLowerCase() + "%';"
Run Code Online (Sandbox Code Playgroud)
现在,这显然非常糟糕,因为它允许SQL注入以及插入通配符,例如%和_.
我的问题是,如何进行查询,即使searchString包含任何这些字符,它们也会被字面上对待?
首先,除非您使用区分大小写的区域设置(这不是MySQL的默认设置)LCASE,LIKE否则请勿使用.
至于转义那些字符,只需在它们前面添加一个\字符,就这样foo%bar变成了foo\%bar.
(自从我使用Java以来已经有一段时间了,但这可能会有效:)
searchString.replaceAll('%', '\\\\%').replaceAll('_', '\\\\_')
Run Code Online (Sandbox Code Playgroud)
(或使用正则表达式):
Regex r = new Regex('(?:%|_)', '\\\\$&');
r.replaceAll(searchString)
Run Code Online (Sandbox Code Playgroud)
至于阻止SQL注入,只需正常绑定变量:
WHERE LCASE(Items.Name) LIKE ?
Run Code Online (Sandbox Code Playgroud)
并创建绑定字符串,如:
'%' + searchString.replaceAll('%', '\\\\%').replaceAll('_', '\\\\_') + '%'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6923 次 |
| 最近记录: |