Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ну, это или использовать ORM, например Linq to SQL или NHibernate, они внутренне используют подготовленные утверждения.

Ответ 3

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

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

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

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

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

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

Теперь в этом запросе не должно быть никаких SQL-инъекций.

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

Ответ 4

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

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

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

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

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

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

Ответ 5

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

SELECT * From Table1 WHERE " + UserInput

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

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

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

Ответ 6

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

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

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

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

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

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

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

Ответ 7

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

Ответ 8

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

Ответ 10

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

Ответ 11

В книге "Создание безопасных приложений ASP.NET" имеется по этой теме.

Ответ 12

Как говорили другие, не объединяйте пользовательский ввод для создания динамических операторов sql; всегда используйте параметризованный SQL при использовании динамического SQL. Однако я укажу, что это правило также применяется при создании динамического sql внутри хранимого proc. Этот факт часто забывают люди. Они считают, что они безопасны, потому что они "используют хранимые процедуры".

Ответ 13

Используйте XSS Secured UrlEncode с использованием Microsoft.Security.Application.AntiXss.UrlEncode и SQL-инъекция не будут работать. Или вы можете использовать ASP.NET - JSON - Сериализация и десериализация

Также проверьте свое приложение с помощью SiteDigger из Macfee Fre Tool.

Немногие из здесь

.NET Security Toolkit v1.0 .NETMon v1.0 Validator.NET v1.0

Ответ 14

Все говорят "Использовать параметры". Мы должны были бы сказать это меньше, если бы это было не так сложно.

Используйте QueryFirst. Искушение конкатенации удаляется, и правильный путь становится самым простым способом. Вы создаете параметр, просто набрав @myParam в своем SQL, инструмент сделает все остальное.

Отказ от ответственности: я написал QueryFirst

Ответ 15

Поймите, что такое SQL Injection, а затем никогда не пишите что-либо уязвимое для него.

Ответ 16

Попробуйте использовать хранимые процедуры и подтвердите ввод данных. Не используйте прямой SQL, например INSERT INTO...