2012-11-30 77 views
27

Dapper如何幫助防止SQL注入?我正在測試不同的DAL技術,並且必須選擇一個才能確保我們的網站安全。我傾向於Dapper(http://code.google.com/p/dapper-dot-net/),但需要一些幫助來了解安全性。Dapper和SQL注入

回答

40

Dapper如何幫助防止SQL注入?

這使得它真的,真的容易做到完全參數化的數據訪問,甚至無需要麼串聯輸入。特別是,因爲您不需要跳過大量的「添加參數,設置參數類型,因爲ADO.NET有吸引式空處理,因此需要衝洗/重複20個參數,因此請檢查空值」,通過參數處理愚蠢方便。這也使得將行變成對象變得非常容易,避免了使用DataTable的誘惑...每個人都贏了。

從評論:

還有一個......是什麼短小精悍的實際幫助怎麼辦呢?

回答下面,我們以marc_s的回覆爲例,並以舊的方式寫下來,假設我們必須先從connection開始。這則:

List<Dog> dogs = new List<Dog>(); 
using(var cmd = connection.CreateCommand()) { 
    cmd.CommandText = "select Age = @Age, Id = @Id"; 
    cmd.Parameters.AddWithValue("Age", DBNull.Value); 
    cmd.Parameters.AddWithValue("Id", guid); 
    using(var reader = cmd.ExecuteReader()) { 
     while(reader.Read()) { 
      int age = reader.ReadInt32("Age"); 
      int id = reader.ReadInt32("Id"); 
      dogs.Add(new Dog { Age = age, Id = id }); 
     } 
     while(reader.NextResult()) {} 
    } 
} 

除了我已經嚴重超simplfied,因爲它也具有廣泛的問題如涉及:

  • 的參數
  • 結果的空處理空值處理使用有序列索引
  • 適應和基礎表的結構變化列
  • 鍵入
  • 數據c結果列的反轉(在各種基元,字符串,枚舉等之間)
  • 特殊處理oh-so-common「在此列表中」場景
  • 對於「執行」,「特殊處理」輸入」
  • 避免傻錯別字
  • 減少代碼維護
  • 處理多個網格
  • 處理多個對象的列表中單個網格
  • 水平返回任意ADO.NET提供者合作(提示:AddWithValue很少存在)
    • 包括像Oracle,其與ADO.NET decoratos需要額外的配置
    • 戲劇很好,例如「微型分析器」兩個緩衝
  • 內置支持的東西(具體支持適用於小到中等數據;最大限度地減少命令持續時間)和非緩衝(適用於大數據;最小化內存使用)訪問
  • 優化的人關心性能和知道「相當多」的數據訪問和元編程
  • 允許你使用您選擇的POCO/DTO/anon-type /任何參數和輸出
  • 允許在輸出不保證生成時使用dynamic(對於多列)或基元等(對於單列) POCO/DTO
  • 避免像EF
  • 這樣的複雜完全類型ORM的開銷,避免了類型爲0的弱類型層的開銷
  • 打開和關閉連接作爲-必要
  • 和廣闊範圍內的其他常見的問題
+0

@niico它在哪裏做的東西是不是'Dog'? –

+1

@niico啊,對,現在和你在一起。當我讀它時,我認爲我的眼睛自動糾正了!是的,這會更清楚。請注意,雖然(如上所述)我正在從另一個使用'dog'作爲變量名稱的答案中拿出例子。 –

+0

現在,您是否使用*** Dapper ***進行參數化查詢? – Kiquenet

22

你只需要使用參數化查詢像你一直應該。由於Dapper只是對「原始」SQL和ADO.NET的「微小」(非常薄)的擴展 - 只需使用參數化的ADO.NET查詢和提供參數即可。

從小巧玲瓏的 - 點 - 網網站查看此示例:

var dog = connection.Query<Dog>("select Age = @Age, Id = @Id", 
           new { Age = (int?)null, Id = guid }); 

的SQL查詢使用參數 - 你提供這些以「小巧玲瓏」的查詢。

總結:本身使用小巧玲瓏不幫助抵禦SQL注入本身 - 使用參數 ADO.NET/SQL查詢但是做(和這些查詢都是絕對的小巧精緻,在所有支持的,沒有任何問題)

+0

THX爲這個問題的答案,而另一個的。還有一件事......那麼精靈實際上有什麼幫助呢? – cdub

+0

@Chris:它將SQL查詢(見上面)的結果變成了一個**友好的用戶友好的.NET對象**(比如'Dog'類) - 而不是爲你留下一堆行/列你必須通過了解你從SQL返回的東西.... –

+0

我將不得不在我的代碼中更改我的sql查詢,然後也使它從新的SqlParameter(...)到那麼小巧的版本呢? – cdub