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.

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

А что такое SERIAL и чем он отличается от INT?

Июль 7, 2025 г.

В SQL, когда вы создаёте поле для идентификатора (id), ключа в таблице, часто используется либо INT, либо SERIAL. Они похожи, но не совсем одно и то же. INT — просто числовой тип данных. Если вы хотите, чтобы значения увеличивались автоматически ...

Читать

Первичный и внешний ключ в SQL : простое объяснение

Июль 7, 2025 г.

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

Читать

НФ не требуют введения суррогатных ключей?

Июль 12, 2025 г.

Сами по себе нормальные формы (НФ) не требуют введения суррогатных (искусственных) ключей, но на практике их часто используют при нормализации, особенно начиная со 2НФ и 3НФ. Давайте разберём подробнее. Что такое суррогатный ключ? Суррогатный ...

Читать

Что такое CROSS JOIN

Июль 4, 2025 г.

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

Читать
 

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

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



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