Инъекции Dapper и SQL

.net .net-3.5 dapper orm

Вопрос

Как Dapper помогает защитить от инъекций SQL? Я тестирую различные технологии DAL и должен выбрать один для обеспечения безопасности нашего сайта. Я склоняюсь к Dapper (http://code.google.com/p/dapper-dot-net/), но вам нужна помощь в изучении безопасности.

Принятый ответ

Как Dapper помогает защитить от инъекций SQL?

Это делает действительно, действительно легко сделать полностью параметризованный доступ к данным, не требуя при этом либо вступать в конкатенацию ввода. В частности, потому что вам не нужно перескакивать через множество «добавить параметр», установить тип параметра, проверить значение «нуль», поскольку ADO.NET имеет sucky null-handling , rinse / repeat для 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()) {}
    }
}

кроме того, что я чрезмерно упрощен, так как он также затрагивает широкий круг вопросов, таких как:

  • нулевое обращение параметров
  • null обработка столбцов результатов
  • с использованием индексов порядковых столбцов
  • адаптация к структурным изменениям базовой таблицы и типа
  • преобразование данных столбцов результатов (между различными примитивами, строками, перечислениями и т. д.)
  • специальная обработка так называемого «в этом списке»
  • для «выполнения», специальная обработка «примените это отдельно к списку входов»,
  • избегая глупых опечаток
  • сокращение обслуживания кода
  • обработка нескольких сеток
  • обработка нескольких объектов, возвращаемых по горизонтали в одной сетке
  • работа с произвольными поставщиками ADO.NET (подсказка: AddWithValue редко существует)
    • включая определенную поддержку таких вещей, как Oracle, для которой требуется дополнительная конфигурация
    • хорошо играет с декорами ADO.NET, такими как «мини-профайлер»,
  • встроенная поддержка как буферизированных (подходит для небольших и умеренных данных, минимизирует продолжительность команд), так и non-bufferesd (подходит для больших данных, минимизируется использование памяти)
  • оптимизированных людьми, которые заботятся о производительности и знают «совсем немного» о доступе к данным и мета-программировании
  • позволяет использовать ваш выбор POCO / DTO / anon-type / независимо как для параметра, так и для вывода
  • позволяет использовать dynamic (для нескольких столбцов) или примитивов и т. д. (для одного столбца), когда вывод не требует генерации POCO / DTO
  • избегайте накладных расходов сложных полностью типизированных 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
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему