2012-01-05 59 views
38

使用動態LINQ庫(link),是否容易受到注入? (如果是的話)如何防止這種情況發生?是否可以通過動態LINQ注入?

一些背景從Security Considerations (Entity Framework)

LINQ實體注入攻擊:

雖然查詢組合物在LINQ能夠實體,它是通過對象模型API執行 。與實體SQL查詢不同,LINQ to Entities查詢不是通過使用字符串操作 或級聯組成的,它們不易受傳統SQL注入攻擊的影響。

由於動態SQL是使用字符串組成的,這是否意味着它可能容易受到注入向量?或者,LINQ to SQL會根據動態LINQ庫中的基礎數據類型自動處理參數化值?

或者它是完全安全的,因爲動態查詢將在內存中執行,而不是針對SQL(從而否定SQL索引的好處)?

我一直在努力理解DynamicLibrary.cs的代碼,但我相信我可以輕鬆地忽略某些東西。

由於這個問題是關於動態LINQ庫本身的,所以可以認爲這個問題同時適用於linq-to-sqllinq-to-entities(儘管上面引用了實體框架)。

回答

29

那麼,我不同意在Dynamic Linq中注入是不可能的。

什麼由Ɖiamond ǤeezeƦanswer描述是正確的,但爲在給定語言中構成appies到標準的LINQ - C#或VB.Net或通過調用擴展方法等.Where與lambda函數。

然後,真的,不可能注入任何東西,因爲.NET Linq to Sql翻譯器當然是寫得很好的。 因此,「SQL注入」是不可能的,這是真的。

但是,動態Linq有可能發生的是「Linq注入」攻擊。在由OP引述LINQ的安全性的解釋,它指出:

LINQ to Entities查詢不被使用的字符串操作或串聯組成,他們是不容易受到傳統的SQL注入攻擊。

基本上這是一個要點。如果查詢由字符串操作組成,那麼它很容易發生注入攻擊。而動態Linq實際上是由字符串組成的,因此它可能容易受到注入攻擊。

顯然,攻擊者必須意識到您使用DynamicLinq並且可能只會攻擊準備數據的事實,因此它會導致有效的惡意Dynamic Linq查詢。

我想強調這個事實 - 最後SQL安全,但無論是原動態的LINQ安全取決於你

,讓您的動態LINQ查詢安全的必須是使用佔位符所有用戶輸入。永遠不要連接你的字符串!

想象一下下面的查詢:

dataset.Where("allowed == 1 and code == \"" + user_entered_data + "\""); 

如果輸入沒有被清除掉,而不是逃脫,攻擊者可能會輸入:

200" or allowed == 0 and code == "200 

這將導致:

allowed == 1 and code == "200" or allowed == 0 and code == "200" 

爲了避免這種情況,你應該使用佔位符:

dataset.Where("allowed == 1 and code == @0", user_entered_data); 

DynamicLinq將使佔位符(在這種情況下:用戶輸入的數據)的λ參數(而不將它變成查詢),並依賴於LINQ到實體(或任何後端是)安全地轉換爲SQL。

+0

好點。該框架無法保護您免受自己的傷害。 – 2012-01-26 17:33:04

+0

因此,導致數據泄漏的注入仍然是可能的,但您仍然與「bobby tables」(丟失/更改數據/刪除數據)事件隔離;那就是可以導致select和where子句改變數據庫中的記錄嗎? – Seph 2012-01-26 19:05:09

+2

@Seph - 不,不可能改變記錄,因爲linq查詢永遠不會轉換爲更新,插入或刪除SQL。唯一可能的攻擊可能是通過修改「where」過濾器來訪問未經授權的數據。 – Krizz 2012-01-26 19:12:12

3

從我從檢查System.Data.Linq命名空間知道的是,SQL對象樹是從LINQ查詢構建的,作爲此過程的一部分,將調用SqlParameterizer類以將所有內聯值替換爲參數。然後將這些值分配給參數。所以SQL注入攻擊是不可能的。

+0

對於linq來說,它通常是正確的,但對於動態linq(哪個OP詢問)查詢是字符串的情況,通常是這樣,請參閱我的答案。 – Krizz 2012-01-26 17:16:16

相關問題