2012-01-31 57 views
3

我有以下查詢字符串EntitySQL和SQL注入

"SELECT VALUE entity FROM Entities AS entity WHERE entity.Client_id 
= 0 && entity.Name LIKE @searchvalue ORDER BY @sorting SKIP @skip LIMIT @limit" 

具有以下PARAM更換

query.Parameters.Add(new ObjectParameter("skip", start)); 
query.Parameters.Add(new ObjectParameter("limit", limit)); 
query.Parameters.Add(new ObjectParameter("searchvalue", searchValue + "%")); 
query.Parameters.Add(new ObjectParameter("sorting", sortField + " " + sortDirection.ToUpper())); 

但我一直在異常結束:

的關鍵表達式'ORDER BY'必須至少有一個對即時輸入範圍的引用 。 ORDER BY附近項目

我猜這是因爲query.Parameters.Add(...)所有引號?我也讀this,但爲什麼好處那麼我需要query.Parameters.Add(...)如果什麼都不會發生?好的,攻擊者可能不會開始一個新的查詢,但我猜他可以操縱當前?

+0

不熟悉entity-sql,但我的猜測是肯定的,它認爲,例如'fieldname asc'是你想要的字段的名稱。你可以用'... ORDER BY @sortfield @sortdir ...'和兩個參數來嘗試嗎? – 2012-01-31 07:59:34

回答

3

猜測: 的第一件事我會嘗試它做這樣的事情

選擇值從實體實體實體WHERE entity.Client_id = 0 & & entity.Name LIKE '@searchvalue' ORDER BY @sorting @sortorder SKIP @skip LIMIT @limit

query.Parameters.Add(new ObjectParameter("searchvalue", searchValue + "%")); 
query.Parameters.Add(new ObjectParameter("sorting", sortField)); 
query.Parameters.Add(new ObjectParameter("sortorder", sortDirection)); 

換句話說:移動排序順序來分離參數。

編輯

如果這不起作用使用Query Builder構造查詢。例如

查看here

祝你好運。

+0

這是我的第一個...所以不,這導致了相同的錯誤 – sra 2012-01-31 08:05:18

+0

@sra:好的,所以可能這是最糟糕的情況,當你不能這樣做。但應該可以使用ObjectQuery構建器。看看[這裏](http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/6b95ad32-6642-4ec7-8051-e0bdfe022eff/) – Tigran 2012-01-31 08:11:33

+0

這就是答案!你應該在答案的底部複製它。 – sra 2012-01-31 08:32:34

0

已嘗試刪除引號@searchvalue,因爲您使用的是參數化查詢IMO,所以不再需要引號。

相反的:

"SELECT VALUE entity FROM Entities AS entity WHERE entity.Client_id 
= 0 && entity.Name LIKE '@searchvalue' ORDER BY @sorting SKIP @skip LIMIT @limit" 

試試這個:

"SELECT VALUE entity FROM Entities AS entity WHERE entity.Client_id 
= 0 && entity.Name LIKE @searchvalue ORDER BY @sorting SKIP @skip LIMIT @limit" 
+0

我忘了這些,你說得對。但是,這不是我的錯誤......我在我的帖子中解決了這個問題。但參數化查詢自動引用? – sra 2012-01-31 08:23:46

+0

如有必要,它將自動應用引號(例如,在使用字符串時)。不需要在引號中包含參數。 – CadentOrange 2012-01-31 08:43:10

0

你不能使用參數替換列名的。