SQL-инъекции — это тип атаки на веб-приложения, при которой злоумышленник вставляет или "впрыскивает" вредоносные SQL-запросы в поля ввода, чтобы манипулировать базой данных. Атака может привести к получению несанкционированного доступа к данным, их изменению или удалению.
Уязвимость типа инъекции возникает из-за того, что входящие данные не проходят должной фильтрации. Наиболее частая ошибка разработчиков заключается в том, что они не проверяют и не очищают передаваемые параметры, например, идентификаторы (ID), прежде чем использовать их в запросах. Говоря простыми словами, злоумышленник может вставить вредоносный код, например, через кавычки в любом поле ввода данных, будь то параметры в GET/POST запросах или даже через Cookie. Если такие данные поступают в приложение без предварительной обработки, это может привести к серьезным последствиям, таким как SQL-инъекции, которые позволяют злоумышленнику получить несанкционированный доступ к базе данных или выполнить произвольный код.
В случае числового входящего параметра, SQL-инъекция может произойти, когда веб-приложение не проверяет или неправильно обрабатывает числовые данные, введенные пользователем.
Рассмотрим пример на языке SQL:
Пример уязвимого кода
Предположим, у нас есть SQL-запрос, который выбирает данные из таблицы пользователей на основе их идентификатора (ID):
Этот запрос может быть построен динамически в коде на языке программирования (пример на python):
Если пользователь введет число, например 1, то запрос будет выглядеть так:
Однако, если пользователь введет вредоносный ввод, например 1 OR 1=1, то итоговый запрос будет:
Что происходит?
Запрос 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:
В этом случае ? является плейсхолдером для параметра, и библиотека автоматически экранирует любые опасные символы.
2. Проверка и фильтрация ввода:
Если параметризованные запросы по каким-то причинам не могут быть использованы, обязательно проверяйте и фильтруйте входные данные. Например, если ожидается число, убедитесь, что введенное значение действительно является числом.
Пример:
3. Ограничение прав доступа:
База данных должна быть настроена таким образом, чтобы учетные записи, используемые веб-приложением, имели минимально необходимые привилегии. Это может предотвратить серьезные последствия даже в случае успешной атаки.
4. Использование ORM:
Использование Object-Relational Mapping (ORM) библиотек может помочь абстрагироваться от ручного написания SQL-запросов и минимизировать риск инъекций.
Заключение
SQL-инъекции могут быть чрезвычайно опасными, но с правильными методами защиты их можно эффективно предотвратить. Всегда используйте параметризованные запросы, проверяйте и фильтруйте входные данные и ограничивайте права доступа к базе данных.
Вместо оглавления. Что вы найдете на канале QA Helper - справочник тестировщика?
Не забудьте подписаться на канал, чтобы не пропустить полезную информацию: QA Helper - справочник тестировщика
Пишите в комментариях какой пункт было бы интересно рассмотреть более подробно.
Обязательно прочитайте: Что должен знать и уметь тестировщик
Также будет интересно почитать: Вопросы которые задают на собеседовании тестировщикам