Найти в Дзене

SQL инъекция "Числовой входящий параметр". Как защититься?

Оглавление

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

Уязвимость типа инъекции возникает из-за того, что входящие данные не проходят должной фильтрации. Наиболее частая ошибка разработчиков заключается в том, что они не проверяют и не очищают передаваемые параметры, например, идентификаторы (ID), прежде чем использовать их в запросах. Говоря простыми словами, злоумышленник может вставить вредоносный код, например, через кавычки в любом поле ввода данных, будь то параметры в GET/POST запросах или даже через Cookie. Если такие данные поступают в приложение без предварительной обработки, это может привести к серьезным последствиям, таким как SQL-инъекции, которые позволяют злоумышленнику получить несанкционированный доступ к базе данных или выполнить произвольный код.

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

Рассмотрим пример на языке SQL:

Пример уязвимого кода

Предположим, у нас есть SQL-запрос, который выбирает данные из таблицы пользователей на основе их идентификатора (ID):

Этот запрос может быть построен динамически в коде на языке программирования (пример на python):

-2

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

-3

Однако, если пользователь введет вредоносный ввод, например 1 OR 1=1, то итоговый запрос будет:

-4

Что происходит?

Запрос SELECT * FROM users WHERE id = 1 OR 1=1; вернет все строки из таблицы users, потому что условие 1=1 всегда истинно. Это может привести к утечке всех записей из базы данных, а не одной конкретной записи.

Как понять что страница сайта уязвима для инъекций?

В поле ввода введите число и кавычку:
1'

Если вы получите ошибку, типа:
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in ..... on line ...

Вы нашли вид SQL инъекции — Числовой входящий параметр.

Защита от SQL-инъекций

1. Использование параметризованных запросов (Prepared Statements):

Вместо того чтобы вставлять данные напрямую в SQL-запрос, используйте параметризованные запросы, чтобы передавать данные в запрос отдельно от его структуры. Это наиболее безопасный способ избежать SQL-инъекций. Пример на Python с использованием библиотеки sqlite3:

-5

В этом случае ? является плейсхолдером для параметра, и библиотека автоматически экранирует любые опасные символы.

2. Проверка и фильтрация ввода:

Если параметризованные запросы по каким-то причинам не могут быть использованы, обязательно проверяйте и фильтруйте входные данные. Например, если ожидается число, убедитесь, что введенное значение действительно является числом.

Пример:

-6

3. Ограничение прав доступа:

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

4. Использование ORM:

Использование Object-Relational Mapping (ORM) библиотек может помочь абстрагироваться от ручного написания SQL-запросов и минимизировать риск инъекций.

Заключение

SQL-инъекции могут быть чрезвычайно опасными, но с правильными методами защиты их можно эффективно предотвратить. Всегда используйте параметризованные запросы, проверяйте и фильтруйте входные данные и ограничивайте права доступа к базе данных.

-7

Вместо оглавления. Что вы найдете на канале QA Helper - справочник тестировщика?

Не забудьте подписаться на канал, чтобы не пропустить полезную информацию: QA Helper - справочник тестировщика

Пишите в комментариях какой пункт было бы интересно рассмотреть более подробно.

Обязательно прочитайте: Что должен знать и уметь тестировщик

Также будет интересно почитать: Вопросы которые задают на собеседовании тестировщикам