pia*_*ste 7 t-sql sql-server security sql-injection dynamic-sql
我完全清楚,对SQL查询进行清理的正确做法是对它们进行参数化.
我研究了许多预先存在的代码,其中的消毒措施是'
用''
动态字符串替换所有的实例.我想知道我应该如何关注.
事情就是这样:这段代码专门在T-SQL(SQL Server 2008R2及更高版本)上运行,据我所知,它'
是T-SQL 的唯一转义字符.
那么,你将如何执行注射攻击以超越上述措施?即就像T-SQL一样,非常"天真"的消毒实际上非常可靠.
是的,单引号是唯一的转义字符,所以你大部分都可以,但也不完全可以。
使用参数虽然最好,但主要只是进行手动替换'
。''
但是,它们还强制规定最大字符串长度。当然,如果我们谈论非字符串参数,它们将具有强制执行数据类型的好处(即 a'
不需要对数字、日期/时间等类型进行转义,因为它对它们无效首先)。
您可能仍然遇到的问题是 SQL 注入的一个子集,称为 SQL 截断。这个想法是强制动态 sql 的某些部分离开字符串的末尾。我不确定这在实践中发生的可能性有多大,但是,根据构建动态 sql 的方式和位置,您需要确保保存要执行的动态 SQL 的变量足够大以保存静态片段您的代码加上所有变量,假设它们以最大长度提交。
这是来自 MSDN 杂志的一篇文章,新的 SQL 截断攻击以及如何避免它们,其中展示了常规 SQL 注入和 SQL 截断。您将在文章中看到,为了避免 SQL 注入,他们大多只是执行REPLACE(@variable, '''', '''''')
方法,但也展示了QUOTENAME(@variable, '[')
在某些情况下的使用。
编辑(2015-01-20):这是一个很好的资源,虽然不是特定于 SQL Server,但详细介绍了各种类型的 SQL 注入: https ://www.owasp.org/index.php/Testing_for_SQL_Injection_(OTG-INPVAL- 005)
下面的文章与上面的文章相关。这是特定于 SQL Server 的,但就整体安全性而言更通用。有与 SQL 注入相关的部分:
https://www.owasp.org/index.php/Testing_for_SQL_Server