sql SQL-инъекции

Forums:

SQL-инъекция — техника, при которой злоумышленник пользуется недостатками в коде приложения, который отвечает за построение динамических SQL-запросов.
Внедрение SQL, в зависимости от типа используемой СУБД и условий внедрения, может дать возможность атакующему выполнить произвольный запрос к базе данных (например, прочитать содержимое любых таблиц, удалить, изменить или добавить данные), получить возможность чтения и/или записи локальных файлов и выполнения произвольных команд на атакуемом сервере.
Пример:
$id = $_GET['id'];
$res = mysqli_query("SELECT * FROM news WHERE id_news = " . $id);

Если на сервер передан параметр id, равный 5 (например так: http://example.org/script.php?id=5), то выполнится следующий SQL-запрос:

SELECT * FROM news WHERE id_news = 5

Но если злоумышленник передаст в качестве параметра id строку "-1 OR 1=1" (например, так: http://example.org/script.php?id=-1+OR+1=1), то выполнится запрос:

SELECT * FROM news WHERE id_news = -1 OR 1=1

Таким образом, изменение входных параметров путём добавления в них конструкций языка SQL вызывает изменение в логике выполнения SQL-запроса.

Примеры возможных действий при наличии sql уязвимости: создание нового суперпользователя, получение данных с любыми привилегиями, измение/удаление данных, отображение структуры БД, в некоторых СУБД (например в MSSQL Server) можно получить доступ к операционной системе сервера базы данных.

Методы борьбы с SQL-инъекциями

  • Использование подготовленных запросов
  • Проверка данных на соответствие типу (например, целые числовые значения можно проверить функцией is_int())
  • Проверка простых строк с ожидаемым набором символов (например имя, e-mail пользователя) регулярными выражениями
  • Не выводить подробную информацию об ошибке в случае неудачной попытки sql-инъекции

Источники

Key Words for FKN + antitotal forum (CS VSU):