删除非字母数字字符可以防止SQL注入

时间:2017-03-22 13:35:28

标签: sql tsql security sql-injection

想象一个简单的查询:

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或更高版本中执行。

1 个答案:

答案 0 :(得分:1)

我没有很好的妥协案例,但我可以告诉你我如何试图以防御性方式对抗它......

  1. 考虑将表格访问列入白名单

  2. 也许您可以限制对特定表子集的访问。理想情况下,这些表遵循通用的命名方案,因此可以根据该方案验证表名。

  3. 如果不能将表名列入白名单 - 您至少可以通过查询sys.tables系统表来检查数据库中是否存在提供的表名。

  4. 对于SQL Server,您应将表名放在方括号

  5. SELECT COUNT(*) FROM [" + tableName + "]"

    此SQL注入资源将彻底回​​答您的问题:OWASP Cheat Sheet