Как избежать атак с использованием SQL-инъекций в моем приложении ASP.NET? - PullRequest
17 голосов
/ 20 ноября 2008

Мне нужно избегать уязвимости для SQL-инъекций в моем приложении ASP.NET. Как мне это сделать?

Ответы [ 16 ]

24 голосов
/ 20 ноября 2008

Даже если ваш вопрос очень общий, всегда применяются несколько правил:

  • Использовать параметризованные запросы (SqlCommand с SqlParameter) и вводить пользовательский ввод в параметры.
  • Не создавайте строки SQL из непроверенного пользовательского ввода.
  • Не думайте, что вы можете создать дезинфицирующую процедуру, которая может проверять вводимые пользователем данные для любого вида уродства. Крайние случаи легко забываются. Проверка числового ввода может быть достаточно простой, чтобы вы были в безопасности, но для строкового ввода просто используйте параметры.
  • Проверка уязвимостей второго уровня - не создавайте строки запросов SQL из значений таблиц SQL, если эти значения состоят из пользовательского ввода.
  • Использование хранимых процедур для инкапсуляции операций базы данных.
17 голосов
/ 20 ноября 2008

Использовать Подготовленные операторы (ссылка на учебник ASP.NET, в котором используются подготовленные операторы в разделе «Добавление узлов для продуктов»). это все, что нужно сделать.

Хорошо, или используйте ORM, например Linq to SQL или NHibernate , они внутренне используют подготовленные операторы.

14 голосов
/ 20 ноября 2008

Используйте параметры! Это действительно так просто: -)

Создайте свои запросы следующим образом (для сервера MS Sql с C #):

SqlCommand getPersons = new SqlCommand("SELECT * FROM Table WHERE Name = @Name", conn); 

Здесь @Name - это параметр, в котором вы хотите избежать внедрения SQL, а conn - это объект SqlConnection. Затем, чтобы добавить значение параметра, вы делаете следующее:

getPersons.Parameters.AddWithValue("@Name", theName);

Здесь theName - это переменная, которая содержит имя, которое вы ищете.

Теперь нельзя делать какие-либо SQL-инъекции для этого запроса.

Поскольку это так просто, нет причин не использовать параметры.

12 голосов
/ 06 августа 2009

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

Никогда не использовать динамический SQL - Использовать параметризованный SQL или хранимые процедуры

Никогда не подключаться к базе данных с использованием учетной записи уровня администратора - Использовать учетную запись с ограниченным доступом для подключения к базе данных

Не хранить секреты в виде простого текста - Шифровать или хэшировать пароли и другие конфиденциальные данные; Вы также должны зашифровать строки подключения

Исключения должны раскрывать минимальную информацию - Не показывать слишком много информации в сообщениях об ошибках; использовать customErrors для отображения минимальной информации в случае необработанной ошибки; установите для debug значение false

Полезная ссылка на MSDN Остановить SQL-инъекцию

5 голосов
/ 20 ноября 2008

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

SELECT * From Table1 WHERE " + UserInput

UserInput может быть вредоносным и содержать другие заявления, которые вы не намереваетесь.

Чтобы избежать этого, вам нужно избегать объединения вашего запроса вместе.

Вы можете сделать это с помощью параметризованных запросов - проверьте объект DBCommand для вашего конкретного вида БД.

4 голосов
/ 06 августа 2009

Используйте параметризованные запросы и / или хранимые процедуры и анализируйте ваши параметры с помощью параметров SQL. Никогда не генерирует код SQL путем объединения строк. Также прочитайте немного о внедрении SQL и о написании безопасного кода, потому что предотвращение внедрения SQL - это лишь малая часть безопасности. Существует много других (например, XSS - межсайтовый скриптинг). Если хакер хочет взломать ваш сайт / приложение, он будет искать не только SQL-инъекцию.

4 голосов
/ 06 августа 2009

Скотт Гатри опубликовал приличную небольшую статью об этом некоторое время назад. В ней он предлагает 5 предложений для защиты себя:

  1. Не создавайте динамические операторы SQL без использования механизма кодирования параметров, безопасного для типов. [...]

  2. Всегда проводите проверку безопасности вашего приложения, прежде чем запускать его в производство, и устанавливайте формальный процесс безопасности для проверки всего кода в любое время, когда вы вносите обновления. [...]

  3. Никогда не храните конфиденциальные данные в открытом виде в базе данных. [...]

  4. Убедитесь, что вы пишете модульные тесты автоматизации, которые специально проверяют ваш уровень доступа к данным и приложение на предмет атак SQL-инъекций. [...]

  5. Блокируйте вашу базу данных, чтобы предоставить веб-приложению доступ к ней только с минимальным набором разрешений, необходимых для работы. [...]

Он неплохо объясняет почему они важны, а также ссылки на несколько других ресурсов ...

3 голосов
/ 06 августа 2009

НИКОГДА не доверяйте вводу пользователя, всегда проверяйте его и используйте параметры sql. Должно быть достаточно оснований для предотвращения внедрения SQL.

2 голосов
/ 06 августа 2009

Всегда использовать только параметризованные запросы.

2 голосов
/ 01 декабря 2008

Надеюсь, это поможет:

http://www.codersbarn.com/post/2008/11/01/ASPNET-Data-Input-Validation.aspx

Короткий ответ - использовать параметризованные запросы.

Энтони :-) www.codersbarn.com

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