动态查询和sql注入

时间:2010-02-17 11:17:36

标签: asp.net sql-server

我有一个存储过程,它接收一个字符串参数“OrderByColumn”并相应地构建动态查询 这是我的存储过程代码的一部分:

ROW_NUMBER() OVER (ORDER BY 
  CASE WHEN @OrderByColumn='Date' AND @OrderDirection=0 THEN tbl_Docs.Date END ASC,
  CASE WHEN @OrderByColumn='Count' AND @OrderDirection=0 THEN tbl_Docs.Count END ASC,

在我调用存储过程的函数后面的代码中我有:

cmd.Parameters.Add("@OrderByColumn", SqlDbType.NVarChar).Value = orderByColumn;
cmd.Parameters.Add("@OrderDirection", SqlDbType.Int).Value = orderDirection;

用户通过单击gridviews列标题设置OrderByColumn参数,因此没有直接的用户输入,因此我看到没有选项可以注入任何东西......

在书中他们还验证了orderByColumn字符串,我不明白为什么需要它,因为我已经注意到用户无法输入直接表达式。

我的问题是:

安全吗?

我还在一些书中读到ORDER BY子句不支持使用参数 这是什么意思?

4 个答案:

答案 0 :(得分:1)

这似乎足够安全。

我没有完全遵循这一部分

  

我还在一些书中读过ORDER   BY子句不支持使用   参数。

您的意思是ORDER(ASC / DESC)还是列?

如果您正在引用该列,则可以实现此目的。像

这样的东西
DECLARE @Table TABLE(
        ID INT,
        Val INT
)

INSERT INTO @Table SELECT 1, 3
INSERT INTO @Table SELECT 2, 2
INSERT INTO @Table SELECT 3, 1

DECLARE @FieldNumber INT

SELECT @FieldNumber = 1

SELECT *
FROM    @Table
ORdER BY 
            CASE @FieldNumber 
                WHEN 1 THEN ID
                WHEN 2 THEN Val
            END

SELECT @FieldNumber = 2

SELECT *
FROM    @Table
ORdER BY 
            CASE @FieldNumber 
                WHEN 1 THEN ID
                WHEN 2 THEN Val
            END

答案 1 :(得分:1)

安全吗?
是的,这看起来很好。该值不会被连接成一个SQL字符串然后执行,而且您实际上正在验证是否显式检查某些有效值。

我还在一些书中读到ORDER BY子句不支持使用参数。 这是什么意思?
这意味着您不能(例如)“ORDER BY @SomeVariable”,其中@SomeVariable是要排序的列。因此,您需要使用像您正在做的CASE方法。

答案 2 :(得分:0)

验证不仅限于SqlInjection攻击,还有许多其他原因可以验证输入。

Parameters的处理方式与OVER子句中的constant类似,但会被忽略。所以它基本上不是支持参数的问题,而是你获得的结果,不受使用的影响

答案 3 :(得分:0)

我认为它也是安全的...参数的内容不会直接包含在存储过程发出的查询中 - 您只是测试参数来决定自己在查询中放入什么。

我认为你可以有良心......