我有一个应用程序,允许用户使用LIKE Operator输入他们的SQL,并为动态参数添加至少一个占位符,例如:
SELECT * FROM Usergroups WHERE Username LIKE ?;
在后端,它将构建 PreparedStatements 并根据登录信息中的当前用户名设置该参数。如果某人可以注册通配符名称(如%),那么它可以查看所有用户组。
是否有防止这种SQL通配符注入的标准方法? 我应该如何清理输入的SQL或参数?
谢谢!
答案 0 :(得分:2)
如果您不想在字符串比较中使用通配符,最简单的解决方案是避免使用LIKE
而是使用=
:
WHERE Username = 'The 7% Solution'
LIKE
的标准SQL行为(适用于任何类型的SQL实现)都应在通配符前加上转义字符来转出。您可以选择应该用作转义字符的字符,但是由于某些原因,文档中给出的示例通常为@
,可能仅是因为该字符很少用于文本模式。
WHERE Username LIKE 'The 7@% Solution' ESCAPE '@'
如果需要包含与转义字符相同的文字字符,请在模式中将该字符加倍,然后将其与单个文字字符匹配。
WHERE Username LIKE 'Seti@@Home' ESCAPE '@'
某些SQL实现,例如MySQL(请参见LIKE in MySQL docs),假定默认转义字符为\
:
WHERE Username LIKE 'The 7\% Solution'
但是其他品牌没有定义默认的转义字符,例如Oracle。参见LIKE in Oracle docs。您必须指定ESCAPE
子句,否则通配符就无法转义。
Microsoft SQL Server向LIKE谓词添加了非标准的模式匹配,因此您可以搜索字符范围。您可以将通配符放在方括号内,使其像文字字符一样工作,就好像它是一个字符的范围一样。参见LIKE Transact-SQL。
WHERE Username LIKE 'The 7[%] Solution'
对不起,从一个品牌的SQL数据库到另一个品牌,您的问题答案并不完全一致。