Dot-Net

Dapper 和 SQL 注入

  • November 30, 2012

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

Dapper 如何幫助防止 SQL 注入?

它使完全參數化的數據訪問變得非常非常容易,而無需連接輸入。特別是,因為您不需要跳過大量“添加參數、設置參數類型、檢查 null,因為 ADO.NET 有糟糕的 null 處理、沖洗/重複 20 個參數”,從而使參數處理變得非常方便. 它還使將行變成對像變得非常容易,避免了使用的誘惑DataTable……每個人都贏了。

來自評論:

還有一個……那麼,dapper 到底有什麼幫助呢?

為了回答,讓我們以 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()) {}
   }
}

除了我過於簡單化了,因為它還處理了廣泛的問題,例如:

  • 參數的空處理

  • 結果列的空處理

  • 使用序數列索引

  • 適應底層表和類型的結構變化

  • 結果列的數據轉換(各種原語、字元串、枚舉等之間)

  • 非常常見的“在此列表中”場景的特殊處理

  • 對於“執行”,“將其單獨應用於輸入列表”的特殊處理

  • 避免愚蠢的錯別字

  • 減少程式碼維護

  • 處理多個網格

  • 處理在單個網格中水平返回的多個對象

  • 使用任意 ADO.NET 提供程序(提示:AddWithValue很少存在)

    • 包括對 Oracle 等需要額外配置的特定支持
    • 與 ADO.NET 裝飾器(例如“mini-profiler”)配合得很好
  • 對緩衝(適用於中小型數據;最小化命令持續時間)和非緩衝(適用於大數據;最小化記憶體使用)訪問的內置支持

  • 由關心性能並“相當了解”數據訪問和元程式的人優化

  • 允許您使用您選擇的 POCO / DTO / anon-type / 不管參數和輸出

  • dynamic當輸出不保證生成 POCO / DTO 時,允許使用(對於多列)或原語等(對於單列)

  • 避免像 EF 這樣的複雜全類型 ORM 的成本

  • 避免弱類型層的成本,例如DataTable

  • 根據需要打開和關閉連接

  • 以及大量其他常見問題

引用自:https://stackoverflow.com/questions/13653461