Dapper和SQL注入

.net .net-3.5 dapper orm

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

一般承认的答案

Dapper如何帮助防止SQL注入?

这使得完全参数化数据访问变得非常非常容易,无需连接输入。特别是,因为你并不需要通过大量的“20个参数添加参数,设置参数类型,检查空,因为ADO.NET有苏茨基空处理 ,冲洗/重复”地跳,通过使参数处理愣神方便。它还使得将行转换为对象变得非常简单,避免了使用DataTable的诱惑...每个人都获胜。

来自评论:

还有一个......那个小巧玲珑实际上有什么帮助呢?

回答一下,让我们以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()) {}
    }
}

除了我过分夸大,因为它还涉及广泛的问题,如:

  • null处理参数
  • null处理结果列
  • 使用序数列索引
  • 适应基础表和类型的结构变化
  • 结果列的数据转换(在各种基元,字符串,枚举等之间)
  • 特殊处理哦这么常见的“在此列表中”场景
  • 对于“执行”,特殊处理“将此单独应用于输入列表”
  • 避免愚蠢的错别字
  • 减少代码维护
  • 处理多个网格
  • 处理在单个网格中水平返回的多个对象
  • 使用任意ADO.NET提供程序(提示: AddWithValue很少存在)
    • 包括对Oracle等需要额外配置的东西的特定支持
    • 与ADO.NET decoratos很好地配合,例如“mini-profiler”
  • 内置支持缓冲(适用于小到中等数据;最小化命令持续时间)和非bufferesd(适用于大数据;最小化内存使用)访问
  • 由关心性能的人优化,并且对数据访问和元编程都非常了解
  • 允许您使用您选择的POCO / DTO / anon-type /无论参数和输出如何
  • 当输出不保证生成POCO / DTO时,允许使用dynamic (对于多列)或基元等(对于单列)
  • 避免复杂的完全类型的ORM(如EF)的开销
  • 避免像DataTable这样的弱类型层的开销
  • 根据需要打开和关闭连接
  • 以及其他一系列常见问题

热门答案

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



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因