我試圖用LINQ創建動態WHERE子句。我有一個工作示例,但我擔心SQL注入不安全。動態LINQ中的安全動態列名稱
以下LINQ代碼:
var oQuery = _db.People.Where("FirstName.Contains(@0)", "kev");
產生以下SQL:
SELECT
[Extent1].[FirstName] AS [[FirstName],
[Extent1].[LastName] AS [[LastName],
WHERE [Extent1].[[FirstName] LIKE '%kev%'
這個偉大的工程,但現在我想用一個動態的列名也。所以,我想我會做到以下幾點:
var oQuery = _db.People.Where("@0.Contains(@1)", strSelectedColumn,"kev");
但是,這將產生以下SQL:
SELECT
[Extent1].[FirstName] AS [[FirstName],
[Extent1].[LastName] AS [[LastName],
WHERE N'FirstName' LIKE N'%kev%'}
這顯然是錯誤的,並給出0行作爲結果,因爲他是比較兩個字符串。通過使用參數LINQ可能只是在構建查詢時將字符串作爲字符串注入,而在構建期間不使用有效的列名稱。
的解決方法就是使用下面的LINQ查詢:
var oQuery = _db.People.Where(strSelectedColumn + ".Contains(@0)", "kev");
但這個結果可能不安全的SQL可用於注入SQL。
如何使用我的動態LINQ列,仍然可以獲取安全代碼?
你如何提供用戶可以選擇的字段名稱? –
他們不能真正選擇動態,我用它過濾網格中的列,我想重新使用不同頁面上的網格。 –