2010-02-17 36 views
1

我有一個存儲過程,它接收一個字符串參數「OrderByColumn」並相應地構建動態查詢。
這是我的存儲過程的代碼部分:動態查詢和sql注入

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; 

用戶通過點擊設置OrderByColumn參數gridviews列標題,所以沒有直接的用戶輸入,所以我看到沒有選擇注入任何東西...

在書中,他們還驗證orderByColumn字符串,我不明白爲什麼它需要,因爲正如我注意到的,用戶不能輸入直接表達式。

我的問題是:

是否安全?

我也讀過一些書,ORDER BY子句不支持使用參數。
這是什麼意思?

+0

你爲什麼不使用orm? – Paco 2010-02-17 11:19:15

+0

圍繞ORDER BY的問題的最後一部分是您必須明確定義列名稱。 – 2010-02-17 11:20:13

回答

1

這看起來足夠安全,可以使用。

我不是完全跟隨這部分

我也看過一些書的順序 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 
+0

如果我這樣做了「case」,那麼我將無法在其末尾添加:ASC/DESC。 – mariki 2010-02-17 17:05:04

0

驗證不僅侷限於SqlInjection攻擊,還有許多其他原因可以驗證輸入。

Parameters的處理方式與OVER子句中的處理方式相同,因爲constant被忽略。所以它基本上不是支持參數的問題,而是你得到的結果,它不受使用的影響

0

我認爲它是安全的,以及...參數的內容不被直接計入存儲過程所發出的查詢 - 你只是測試參數去決定要放什麼查詢自己。

我認爲你可以問心無愧......

1

是它的安全?
是的,這似乎很好。該值不會被連接成一個SQL字符串然後被執行,而且您實際上正在驗證顯式檢查某些有效值。

我也讀過一些書,ORDER BY子句不支持使用參數。 這是什麼意思?
這意味着你不能做(例如,)「ORDER BY @SomeVariable」其中@SomeVariable是要排序的列。因此,您需要像使用CASE一樣使用CASE方法。