Внедрение SQL (SQLi) относится к атаке с внедрением, при которой злоумышленник может выполнять вредоносные операторы SQL (также часто называемые вредоносными полезными данными), которые контролируют сервер базы данных веб-приложения ( также обычно называемая системой управления реляционными базами данных — РСУБД).

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

Внедрение SQL обычно происходит, когда пользователь вместо ввода имени/идентификатора дает вам инструкцию SQL, которую вы неосознанно запускаете в своей базе данных. Этот запрос может быть любым и приведет к компрометации системы.

Подготовленные отчеты

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

Подготовленные операторы в основном работают следующим образом:

  1. Подготовка: шаблон оператора SQL создается и отправляется в базу данных. Определенные значения остаются неуказанными, они называются параметрами, заполнителями или переменными привязки, которые часто обозначаются знаком «?».
  2. База данных анализирует, компилирует и выполняет оптимизацию запроса по шаблону оператора SQL и сохраняет результат без его выполнения.
  3. Выполнить: позже приложение привязывает значения к параметрам, и база данных выполняет инструкцию. Приложение может выполнять оператор столько раз, сколько захочет, с разными значениями.

Подготовленные заявления против SQLi

Идея очень проста — запрос и данные отправляются на сервер базы данных отдельно.

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

$spoiled_data = "1; DROP TABLE users;"
$query        = "SELECT * FROM users where id=$spoiled_data";

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

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

Пользовательский ввод никогда не обрабатывается как оператор SQL и, следовательно, никогда не выполняется. Именно по этой причине любой внедренный вредоносный код SQL не причинит вреда. Таким образом, the"DROP TABLE CUSTOMERS" никогда не будет выполняться как инструкция.

Короче говоря, с подготовленными запросами вредоносный код, вводимый пользователем, не будет выполняться, что предотвратит работу SQLi!