我有一个存储过程,它接收一个字符串参数“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子句不支持使用参数 这是什么意思?
答案 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)
我认为它也是安全的...参数的内容不会直接包含在存储过程发出的查询中 - 您只是测试参数来决定自己在查询中放入什么。
我认为你可以有良心......