首先,我很清楚参数化查询是最好的选择,但我想知道是什么让我在下面提出的策略容易受到攻击。人们坚持以下解决方案不起作用,所以我正在寻找一个为什么它不起作用的例子。
如果动态 SQL 在被发送到 SQL Server 之前使用以下转义在代码中构建,什么样的注入可以解决这个问题?
string userInput= "N'" + userInput.Replace("'", "''") + "'"
在这里回答了一个类似的问题,但我不相信任何答案都适用于此。
在 SQL Server 中无法使用“\”转义单引号。
我相信使用 Unicode 的SQL Smuggling (在此处概述)会因为正在生成的字符串被单引号前面的 N 标记为 Unicode 的事实而受阻。据我所知,SQL Server 不会自动将其他字符集转换为单引号。如果没有未转义的单引号,我不相信注入是可能的。
我也不相信字符串截断是一个可行的向量。根据微软的说法, SQL Server 肯定不会进行截断,因为 an 的最大大小为nvarchar
2GB 。2 GB 的字符串在大多数情况下是不可行的,在我的情况下也是不可能的。
二阶注射是可能的,但如果:
- 使用上述方法对进入数据库的所有数据进行清理
- 数据库中的值永远不会附加到动态 SQL 中(当您可以在任何动态 SQL 字符串的静态部分中引用表值时,您为什么还要这样做呢?)。
我并不是说这比使用参数化查询更好或替代,但我想知道我概述的内容是如何易受攻击的。有任何想法吗?