SQL-инъекция: как работает и как защититься

SQL-инъекция (SQL Injection) — это распространённая и весьма опасная уязвимость веб-приложений. Она позволяет злоумышленнику вмешиваться в SQL-запросы, исполняемые на сервере, и получить несанкционированный доступ к данным, изменить их или даже удалить. При этом, злоумышленнику часто достаточно иметь доступ к фронт-енд сайта или приложения, где он экспериментирует с передаваемыми на сервер параметрами.

Этот процесс также не сложно автоматизировать.

В этой статье мы разберём:

  • что такое SQL-инъекция и как она работает;
  • классические примеры на PHP;
  • как защититься от уязвимости;
  • безопасные практики написания кода.

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

Что такое SQL-инъекция

SQL-инъекция — это метод атаки, при котором в параметры SQL-запроса внедряется вредоносный SQL-код. Если параметры (GET, POST) подставляются в SQL-запрос без проверки и экранирования, злоумышленник может, например:

  • получить логины и пароли;
  • обойти авторизацию;
  • удалить таблицы базы данных.

Пример уязвимого SQL-запроса на PHP.

Если пользователь передаст в URL

Запрос на сервере превратится в:

Т.е. вместо фильтрации по логину, мы запросим полный список пользователей.

Таким не хитрым образом, можно изменить логику работы, запросить данные, которые не должны были быть запрошены (и показаны). Если внедриться в INSERT или DELETE запросы, то можно удалить или вставить какие то свои данные, от лица другого пользователя и т.п.

А если в коде используется другой вариант выполнения SQL, который позволяет исполнить сразу несколько запросов:

То инъекции выходят на совсем иной уровень, т.к. открывается возможность внедрять вообще любые запросы:

И безобидный SQL SELECT дополниться удалением целой таблицы:

Как защититься: основные принципы

Не вставляйте данные напрямую в SQL

Никогда не подставляйте пользовательский ввод в SQL-запросы «как есть». Любые данные, полученные от пользователя, нужно проверять, очищать и подготавливать.

(Принцип нулевого доверия ко входным данным.)

Используйте подготовленные выражения (Prepared Statements)

Этот основной способ защиты — следует из первого пункта. Пример с использованием MySQLi:

Или на PDO:

Подготовленные выражения автоматически экранируют значения и предотвращают SQL-инъекции.

Используйте минимальные права доступа к базе

У аккаунта базы данных не должно быть прав на DROP, DELETE без необходимости.

Не показывайте SQL-ошибки пользователю

Они могут подсказать злоумышленнику структуру базы.


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

Помните: чем проще запрос и чем меньше доверия к пользовательским данным — тем безопаснее ваше приложение.

Современные сайты чаще всего получают данную уязвимость вместе с дополнительными плагинами, которые были созданы программистами-любителями. Потому нужно своевременно обновлять и код движка и устанавливать обновления плагинов.

А если какой то плагин не используется, рекомендуется отключать и удалять его файлы. Перефразируя известную песню — no plugin — no cry.

Написать комментарий

Мало букафф? Читайте есчо !

Что такое CROSS JOIN

Июль 4, 2025 г.

Конструкция CROSS JOIN в SQL — это один из видов JOIN, который создаёт декартово произведение двух таблиц: каждая строка из первой таблицы соединяется со всеми строками второй. Если: Таблица A содержит m строк, Таблица B содержит n строк, ...

Читать

SQL-антипаттерны: плохие JOIN'ы и как их избежать

Июль 6, 2025 г.

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

Читать

 

Комментарии к «SQL-инъекция: как работает и как защититься»

Понравилась статья? Есть вопросы? - пишите в комментариях.



Комментарий: