小巧玲珑和SQL注入

cdu*_*dub 39 .net orm .net-3.5 dapper

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

Mar*_*ell 50

Dapper如何帮助防止SQL注入?

这使得完全参数化数据访问变得非常非常容易,无需连接输入.特别是,因为你并不需要通过大量的"添加参数,设置参数类型,检查空跳,因为ADO.NET有苏茨基空处理的20个参数,冲洗/重复",通过使参数处理愣神方便.它还可以很容易地将行转换为对象,避免使用诱惑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()) {}
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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


mar*_*c_s 36

您只需要像往常一样使用参数化查询.由于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 });
Run Code Online (Sandbox Code Playgroud)

SQL查询使用参数 - 您将这些参数提供给"Dapper"查询.

总结一下:使用Dapper本身并没有帮助防止SQL注入本身 - 但是使用参数化的 ADO.NET/SQL 查询(并且这些查询完全由Dapper支持,完全没有问题)