Является ли следующий фрагмент С# восприимчивым к 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 более динамично, чем указано, но не думаю, что это важно для моего вопроса.
Несколько более безопасным решением было бы сделать так, чтобы параметр 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);
Обновление ответа на основе комментариев от SO. Динамический SQL (или действительно любой оператор SQL, это хорошее правило для соблюдения), как правило, обычно открыт для SQL Injection, если их потенциал для ввода пользователем. Если все ваши параметры, которые делают учетную запись SQL, говорят, поступают из другой базы данных или говорят о выпадающем списке и т.д., Тогда нет, это не вписывается в SQL Injection.
Общее правило для запоминания: никогда не позволяйте неутвержденным данным попасть в инструкцию SQL. Все должно быть проверено и добавить их в базу данных в качестве параметра.
CustomerId
- это строка, которую пользователь может ввести, тогда yes. Если это число, то нет. В любом случае, почему вы используете динамический SQL? Вы можете просто выполнить этот SQL напрямую.