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

Can removing non-alphanumeric characters prevent SQL Injection

提问人:ÁEDÁN 提问时间:3/22/2017 更新时间:6/13/2022 访问量:856

问:

想象一个简单的查询:

Declare @sql varchar(100)
Declare @table varchar(20)
Set @table = 'foo'
select @sql = 'select * from ' + @table 
exec(@sql)

这将正常工作,直到有人将@table更改为类似“sys.tables;下拉表栏'

但是我想知道,如果@table从中删除了所有非字母数字字符,是否还会发生SQL注入?在此示例中,恶意@table将 = 'systablesdroptablebar'。

现在我知道使用sp_executesql和参数化 SQL 是最佳实践。所以不要给我任何垃圾!我很好奇,删除所有非字母数字字符的字符串如何被破坏以提供 SQL 注入有效负载。

为清楚起见,此代码块将在 Microsoft SQL Server 2008 或更高版本中执行。

T-SQL 安全性 SQL 注入

评论

0赞 scgough 3/22/2017
与您的明确问题分开,但要考虑的一件事是确保您用于访问数据库的用户帐户没有被授予太多权限。例如,您通常不希望将该角色用于网站帐户。您可以创建一个仅分配了角色的用户。然后不能运行任何语句db_ownerdb_datareaderdb_datawriterdrop
0赞 ÁEDÁN 3/22/2017
这是一个很好的观点,在这种情况下,我正在更多地研究开发人员将在 SQL Server 中使用的实用程序,因此作为管理员,特权内容不适用于我们的上下文。
0赞 scgough 3/22/2017
啊,酷。对于任何外部系统(网站、桌面应用程序、api 等),我总是会创建一个特定的非用户。只是不值得冒险!:Ddb_owner

答:

1赞 ѺȐeallү 3/22/2017 #1

对于你的案例,我没有很好的妥协例子,但我可以告诉你我如何尝试防御性地针对它进行编程......

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

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

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

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

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

这个关于SQL注入的资源将彻底回答你的问题:OWASP备忘单

评论

0赞 ÁEDÁN 3/22/2017
你能详细解释一下为什么我应该用 [] 包装表名吗?它能为我提供什么?
1赞 S3S 3/23/2017
@AndrewNieuwsma,因为它会导致错误。假设 @table = 'users;drop table dbo.users;--' 则执行将是 'SELECT COUNT(*) FROM [users; drop table dbo.users;--',因此,缺少右括号。另请参阅 msdn.microsoft.com/en-us/library/ms176114.aspx
0赞 ѺȐeallү 3/23/2017
@AndrewNieuwsma Yeapers...西蒙是对的。注入将导致查询错误而不是执行...