Защищает ли asp.net от SQL-атак? - PullRequest
7 голосов
/ 28 февраля 2011

По умолчанию ASP.net защищает от атак SQL-инъекций при использовании элементов управления ASP?

Ответы [ 7 ]

10 голосов
/ 28 февраля 2011

Да и нет.

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-инъекций, но только если вы используете их правильно.

9 голосов
/ 28 февраля 2011

Нет. Пока вы предоставляете SQL, вы должны быть умными в том, как вы используете элементы управления.

Обычно это означает очистку ввода и использование параметризованных запросов или хранимых процедур над строками динамического SQL.

Если элемент управления генерирует для вас запросы (например, элементы управления членством и т. Д.), То вы хорошо защищены.

8 голосов
/ 28 февраля 2011

Большинство элементов управления ASP.Net (за исключением DataGrid) вообще не используют SQL.

Если у вас есть собственный SQL в вашем коде (с использованием SqlCommand s), вы не получите никакой бесплатной защиты; вам нужно использовать параметры.

Несколько элементов управления, использующих SQL (SqlDataSource и структура членства), действительно используют параметры и защищены от внедрения.

3 голосов
/ 28 февраля 2011

ASP.NET не защищает от SQL-инъекций!

ASP.NET - это просто платформа для веб-приложений, и она не определяет, каким образом вы получаете доступ к своей базе данных. Это зависит от того, как вы реализуете свой доступ к данным:

  • Если вы используете ADO.NET и строите свои SQL-запросы в виде строк, то вам нужно очистить любой пользовательский ввод, чтобы обезопасить его от инъекций.
  • Если вы используете ADO.NET и используете SqlParameters, то я думаю, что вы защищены от инъекций.
  • Если вы используете инструмент ORM для доступа к данным, то я бы сказал, что вы в безопасности (по крайней мере, при использовании обычных)
  • Если вы используете DataSets, то, вероятно, вы тоже в безопасности.
  • Если вы используете сторонние элементы управления с привязкой к данным, то я надеюсь, что они позаботятся о защите от SQL-инъекций

Возможно, я забыл упомянуть много в своем ответе, но вы можете видеть, что ответ: "это зависит"

1 голос
/ 28 февраля 2011

Нет, ASP.Net не защищает от SQL-инъекций. Предполагается, что поставляемый MS код для элементов управления ASP.NEt не содержит SQL-инъекций, но это не предотвращает всех проблем, с которыми может столкнуться один разработчик. Лучшая защита - хорошее понимание SQL-инъекций и тщательное кодирование. Когда это невозможно по каким-либо причинам, могут помочь такие инструменты, как Инструмент анализа кода Microsoft .NET (CAT.NET) . Это бесплатный плагин VS, который может анализировать сгенерированные сборки и обнаруживать риски внедрения SQL-инъекций, XSS и XPath. Такой инструмент не пуленепробиваемый, но гораздо лучше, чем ничего.

1 голос
/ 28 февраля 2011

Если вы всегда используете SqlParameter s и никогда не объединяете ввод пользователя в SQL, вы должны быть в безопасности. Вы также можете использовать SqlParameter s без хранимых процедур.

0 голосов
/ 28 февраля 2011

Частично. По умолчанию включен фильтр, который затрудняет создание атаки с использованием SQL-инъекции, если она не отключена.

Метод, который многие приложения ASPNET используют для доступа к базам данных MSSQL, также делает их в целом устойчивыми к атакам с использованием SQL-инъекций.

Но все же ВОЗМОЖНО создать уязвимое приложение, если вы достаточно небрежны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...