想象一个简单的查询:
Declare @sql varchar(100)
Declare @table varchar(20)
Set @table = 'foo'
select @sql = 'select * from ' + @table
exec(@sql)
这可以正常工作,直到有人将@table更改为'sys.tables; drop table bar'
但是我想知道@table是否从中删除了所有非字母数字字符,是否仍会发生SQL注入?在这个例子中,恶意@table会='systablesdroptablebar'。
现在我知道使用sp_executesql和参数化SQL是最好的做法。所以不要给我任何垃圾!我很好奇,删除所有非字母数字字符的字符串如何被泄露以提供SQL注入有效负载。
为清楚起见,此代码块将在Microsoft SQL Server 2008或更高版本中执行。
答案 0 :(得分:1)
我没有很好的妥协案例,但我可以告诉你我如何试图以防御性方式对抗它......
考虑将表格访问列入白名单
也许您可以限制对特定表子集的访问。理想情况下,这些表遵循通用的命名方案,因此可以根据该方案验证表名。
如果不能将表名列入白名单 - 您至少可以通过查询sys.tables
系统表来检查数据库中是否存在提供的表名。
对于SQL Server,您应将表名放在方括号
SELECT COUNT(*) FROM [" + tableName + "]"
此SQL注入资源将彻底回答您的问题:OWASP Cheat Sheet