44

Dapper 如何帮助防止 SQL 注入?我正在测试不同的 DAL 技术,并且必须选择一种来保护我们的站点。我倾向于 Dapper (http://code.google.com/p/dapper-dot-net/),但需要一些帮助来了解安全性。

4

2 回答 2

56

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
  • 根据需要打开和关闭连接
  • 以及大量其他常见问题
于 2012-12-01T22:42:03.010 回答
44

您只需要像往常一样使用参数化查询。由于 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 绝对支持这些查询,完全没有问题)

于 2012-11-30T21:30:53.130 回答