Dapper 如何帮助防止 SQL 注入?我正在测试不同的 DAL 技术,必须选择一种来确保我们网站的安全。我倾向于 Dapper (http://code.google.com/p/dapper-dot-net/),但需要一些帮助来了解安全性。
Dapper 如何帮助防止 SQL 注入?
它使得它真的真的轻松进行完全参数化的数据访问,无需连接输入。特别是,因为您不需要跳过大量的“添加参数、设置参数类型、检查 null因为 ADO.NET 的 null 处理很糟糕,冲洗/重复 20 个参数”,通过进行参数处理stupidly方便的。它还使得将行变成对象变得非常容易,避免了使用的诱惑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()) {}
}
}
只是我过于简单化了,因为它还涉及广泛的问题,例如:
- 参数的空处理
- 结果列的空处理
- 使用序数列索引
- 适应底层表和类型的结构变化
- 结果列的数据转换(各种原语、字符串、枚举等之间)
- 对常见的“在此列表中”场景的特殊处理
- 对于“执行”,“将其单独应用于输入列表”的特殊处理
- 避免愚蠢的打字错误
- 减少代码维护
- 处理多个网格
- 处理单个网格中水平返回的多个对象
- working with arbitrary ADO.NET providers (hint:
AddWithValue
rarely exists)
- 包括对 Oracle 等需要额外配置的特定支持
- 与 ADO.NET 装饰器(例如“迷你分析器”)配合得很好
- 对缓冲(适合中小型数据;最大限度地减少命令持续时间)和非缓冲(适合大数据;最大限度地减少内存使用)访问的内置支持
- 由关心性能并且对数据访问和元编程了解“相当多”的人进行优化
- 允许您使用 POCO / DTO / 匿名类型 / 任何参数和输出的选择
- 允许使用任一
dynamic
(对于多列)或基元等(对于单列)当输出不能保证生成 POCO / DTO 时
- 避免像 EF 这样复杂的全类型 ORM 的开销
- 避免弱类型层的开销,例如
DataTable
- 根据需要打开和关闭连接
- 以及大量其他常见问题
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)