【发布时间】:2012-11-19 03:50:59
【问题描述】:
Dapper 如何帮助防止 SQL 注入?我正在测试不同的 DAL 技术,并且必须选择一种来保护我们的站点。我倾向于 Dapper (http://code.google.com/p/dapper-dot-net/),但需要一些帮助来了解安全性。
【问题讨论】:
Dapper 如何帮助防止 SQL 注入?我正在测试不同的 DAL 技术,并且必须选择一种来保护我们的站点。我倾向于 Dapper (http://code.google.com/p/dapper-dot-net/),但需要一些帮助来了解安全性。
【问题讨论】:
Dapper 如何帮助防止 SQL 注入?
它非常非常可以轻松地进行完全参数化的数据访问,而无需连接输入。特别是,因为您不需要跳过大量“添加参数、设置参数类型、检查 null 因为 ADO.NET 有糟糕的 null 处理,冲洗/重复 20 个参数” , 通过使参数处理愚蠢方便。它还使将行转换为对象变得非常容易,避免使用DataTable 的诱惑......每个人都赢了。
来自 cmets:
还有一个……那么 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()) {}
}
}
除了我过于简单化了,因为它还处理了广泛的问题,例如:
AddWithValue 很少存在)
dynamic(用于多列)或原语等(用于单列)DataTable 这样的弱类型层的开销
【讨论】:
Dog的事情?
dog 作为变量名的答案中获取的示例。
您只需要像往常一样使用参数化查询。由于 Dapper 只是对“原始”SQL 和 ADO.NET 的“小”(而且非常薄)扩展 - 只需使用参数化的 ADO.NET 查询并提供参数。
从 Dapper-Dot-Net 站点查看此示例:
var dog = connection.Query<Dog>("select Age = @Age, Id = @Id",
new { Age = (int?)null, Id = guid });
SQL 查询使用参数 - 您将这些参数提供给“Dapper”查询。
总结一下:使用 Dapper 本身并不能帮助防止 SQL 注入 - 但是使用 参数化 ADO.NET/SQL 查询可以(而且 Dapper 绝对支持这些查询,没有问题完全)
【讨论】:
Dog 类) - 相反给你留下一堆行/列,你必须费力地弄清楚你从 SQL 中得到了什么......
SqlConnection 上 - 所以它看不到您在 @987654324 上定义的任何参数@.