防止SQL通配符注入

时间:2019-02-22 11:10:23

标签: sql security wildcard sql-injection sql-like

我有一个应用程序,允许用户使用LIKE Operator输入他们的SQL,并为动态参数添加至少一个占位符,例如:

SELECT * FROM Usergroups WHERE Username LIKE ?; 

在后端,它将构建 PreparedStatements 并根据登录信息中的当前用户名设置该参数。如果某人可以注册通配符名称(如%),那么它可以查看所有用户组。

是否有防止这种SQL通配符注入的标准方法? 我应该如何清理输入的SQL或参数?

谢谢!

1 个答案:

答案 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数据库到另一个品牌,您的问题答案并不完全一致。