Dapper 和 SQL 注入
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根據需要打開和關閉連接
以及大量其他常見問題