保护应用程序免受SQL注入

时间:2013-04-10 13:45:23

标签: sql-server tsql sql-injection

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

由于性能问题,使用少于1200个SQL参数的一些查询爆炸查询不是一个好主意,实际上并不容易。我担心在SQL查询中放入原始值可能会导致SQL注入的安全问题。

那我该怎么办?如果我把原始值放在什么是保护应用程序免受SQL注入攻击的最佳方法?

1 个答案:

答案 0 :(得分: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>',但同样的解决方案仍然有效。)