Россия и Беларусь начали и продолжают войну против целого народа Украины!

SQL-инъекции. Внедрение SQL-кода

  Юрий  | 

  |

  Обновл. 17 Фев 2023  | 

 238

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

Если SQL-инъекция прошла успешно, неавторизованные лица могут читать, создавать, обновлять или даже удалять записи из таблиц базы данных. Этот метод используется хакерами, пентестерами, тестировщиками и не только.

Пример №1: SQL-инъекция с использованием нескольких стейтментов

Предположим, у нас на сайте есть форма для поиска товаров по ID. Фрагмент PHP-кода поиска товара будет выглядеть примерно так:

Если пользователь введет значение 20, SQL интерпретирует это как:

Ничего подозрительного, верно?

Но что, если пользователь введет 20; DROP TABLE Products;? Давайте посмотрим, как SQL интерпретирует это:

Данная команда удалит таблицу Products из базы данных. Это стало возможным, потому что большинство систем управления базами данных (СУБД) могут выполнять несколько команд одновременно.

Пример №2: SQL-инъекция с использованием всегда истинного условия


Другой способ выполнить SQL-инъекцию — это передать условие, которое всегда обрабатывается как true, чтобы данные всегда извлекались, несмотря ни на что.

Давайте взглянем на другой фрагмент PHP-кода, где у нас есть форма входа на наш веб-сайт, и пользователям нужно указать свой логин и пароль.

Если пользователь введет логин как root и пароль как pass, то SQL интерпретирует это как:

Данный фрагмент кода выглядит нормально, когда пользователь вводит корректные данные.

Но что делать, если пользователь введет имя пользователя как invalid_user" OR "1"="1 и пароль как invalid_pass" OR "1"="1? Давайте посмотрим, как SQL отреагирует на это:

Поскольку "1"="1" всегда true, независимо от того, какой логин и пароль введет пользователь, SQL извлечет всех пользователей из базы данных.

Как защититься от SQL-инъекций?

Способ №1: Валидация пользовательского ввода

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

Например:

Данный фрагмент PHP-кода в некоторой степени «проверяет» входные данные.

Способ №2: Использование ORM

ORM (сокр. от «Object Relational Mapping») — это инструмент, который конвертирует SQL-команды в код языка программирования и наоборот.

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

Например, следующий SQL-код:

будет выглядеть как

в SQLAlchemy ORM для Python-кода.

Способ №3: Использование подготовленных запросов

Подготовленные запросы — это SQL-код с плейсхолдерами. Переданные аргументы просто помещаются на место плейсхолдеров.

Например:

Здесь переданные значения помещаются на место ? и структура SQL-кода сохраняется.

Заключение


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

Еще одним альтернативным вариантом защиты при разработке приложений/сайтов является использование фреймворков (таких как Django, Laravel, ASP.NET и др.) вместо того, чтобы писать код с нуля. Фреймворки по умолчанию обрабатывают SQL-инъекции, а также решают многие другие часто возникающие проблемы.

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (1 оценок, среднее: 5,00 из 5)
Загрузка...

Добавить комментарий

Ваш E-mail не будет опубликован. Обязательные поля помечены *