1

我有一个大表单,当我尝试执行 SQL 查询以保存表单数据时,我得到一个SqlException(每个查询大约有 1200 个 SQL 参数)。

由于性能问题,通过几个少于 1200 个 SQL 参数的查询来展开查询并不是一个好主意,实际上也不容易做到。恐怕将原始值放在 SQL 查询中可能会产生 SQL 注入的安全问题。

那么我能做什么呢?如果我输入原始值,保护应用程序免受 SQL 注入攻击的最佳方法是什么?

4

1 回答 1

1

创建参数值的 xml 并将 xml 作为单个参数传递。然后只需将 xml 解析为任意数量的变量(或临时表中的行)。例如,而不是:

SELECT ?, ?, ?

并传入'my first form value','my second form value''my third form value', 你可以这样做:

DECLARE @x XML SET @x = ?;
SELECT 
    T.x.value('@a1', 'NVARCHAR(50)')
  , T.x.value('@a2', 'NVARCHAR(50)')
  , T.x.value('@a3', 'NVARCHAR(50)')
FROM @x.nodes('/form/data') AS T(x)

并只传递一个 xml 参数,'<form><data a1="my first form value" a2="my second form value" a3="my third form value" /></form>'. SQL Server 2005+ 有一个非常高效的 xml 解析器,所以我想这与直接传递参数一样快。

当然,您必须采取措施生成注入弹性的 xml,但如果我必须将这么多的信息传递给查询,我会这样做。

(也就是说,我很难想象一个人可能合法地需要那么多平面参数的情况。接受任意数据而不是显式参数对我来说更有意义,在这种情况下,上面的 xml 可能更像'<form><data name="a1" value="my first form value" /><data name="a2" ... </form>',但同样的解决方案仍然有效。)

于 2013-04-11T02:19:11.487 回答