Является ли это восприимчивым к инъекционной атаке

1

Является ли следующий фрагмент С# восприимчивым к SQL Injection Attack?

string sql = @"
    declare @sql navarchar(200)
    set @sql = 'select * from customers where customerId = ' + convert(navarchar, @custId)
    exec sp_sqlexec @sql
"

oSQL.Parameters.Add("custId", CustomerId);
DataTable dt = oSQL.ExecuteDataTable(sql);

Я понимаю, что это тривиальный оператор sql, но меня больше интересует подход использования exec sp_sqlexec. Заявление sql более динамично, чем указано, но не думаю, что это важно для моего вопроса.

  • 3
    Если CustomerId - это строка, которую пользователь может ввести, тогда yes. Если это число, то нет. В любом случае, почему вы используете динамический SQL? Вы можете просто выполнить этот SQL напрямую.
  • 0
    Хотя @DStanley технически верен, главное здесь (по крайней мере для меня) заключается в том, что этот базовый подход широко открыт для внедрения SQL. На SO есть масса информации об этом.
Показать ещё 5 комментариев
Теги:
sql-server

2 ответа

3
Лучший ответ

Несколько более безопасным решением было бы сделать так, чтобы параметр dynaimc был параметризован:

(Обратите внимание, что вы также должны использовать sp_executesql:

string sql = @"
    declare @sql navarchar(200)
    set @sql = 'select * from customers where customerId = @customerId'
    exec sp_sqlexecuseSQL @sql, N'@customerId INT', @customerId = @custId
"

oSQL.Parameters.Add("custId", CustomerId);
DataTable dt = oSQL.ExecuteDataTable(sql);
2

Обновление ответа на основе комментариев от SO. Динамический SQL (или действительно любой оператор SQL, это хорошее правило для соблюдения), как правило, обычно открыт для SQL Injection, если их потенциал для ввода пользователем. Если все ваши параметры, которые делают учетную запись SQL, говорят, поступают из другой базы данных или говорят о выпадающем списке и т.д., Тогда нет, это не вписывается в SQL Injection.

Общее правило для запоминания: никогда не позволяйте неутвержденным данным попасть в инструкцию SQL. Все должно быть проверено и добавить их в базу данных в качестве параметра.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню