Да и нет.
ADO.NET имеет очень хорошую поддержку параметризации, и при правильном использовании значения параметров будут автоматически очищены для предотвращения внедрения SQL.Таким образом, вы можете добавлять параметры в SqlCommand
(или SqlDataSource
элемент управления), не беспокоясь слишком о том, что в них содержится.
Хорошая новость заключается в том, что параметризация ваших вещей действительно проста,Я покажу вам пример C # для того, чтобы сделать это программно, но вы можете сделать это декларативно с серверными элементами управления, если хотите.
Плохая новость заключается в том, что, как и все остальное, вы все ещенужно думать о том, что ты делаешь.Любая строка из небезопасного источника должна быть параметризована , если вы хотите иметь какую-либо защиту.Если вы вставите его дословно в запрос, вы обойдете функции безопасности ADO.NET.
Безопасный:
string name = txtName.Text;
sqlCommand.CommandText = "select * from product where name = @name";
sqlCommand.Parameters.AddWithValue("name", name);
Незащищенный:
string name = txtName.Text;
sqlCommand.CommandText = "select * from product where name = " + name;
Если что-то в вашем запросе SQL исходит прямо изпользователь, вам нужно указать его в параметре или все ставки отключены.И, как и почти все остальное, можно застрелиться в ноге, если вы действительно этого хотите. Например, вы можете взять код SQL, поместить его в параметр и передать его в SQL EXEC
заявление.Но вы бы этого не сделали, потому что это очень плохая идея.
Все еще небезопасно (да, я видел это в рабочем коде)!
string sql = "select * from product where name = " + txtName.Text;
sqlCommand.CommandText = "exec(@sql)";
sqlCommand.Parameters.AddWithValue("sql", sql);
TL; DR: ADO.NET обладает отличными функциями для остановки SQL-инъекций, но только если вы используете их правильно.