Технологии

SQL-инъекции: что это и как защититься?

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

Dan Dasakami

Dan Dasakami

3 апреля 2025 · 3 минут чтения

Cover

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

Как работают SQL-инъекции?

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

Простой пример уязвимости:

Допустим, у нас есть веб-форма для входа в систему:

username = input("Введите имя пользователя: ") password = input("Введите пароль: ") query = f"SELECT * FROM users WHERE username = '{username}' AND password = '{password}'"

Если пользователь введёт:

' OR '1'='1

Запрос примет следующий вид:

SELECT * FROM users WHERE username = '' OR '1'='1' AND password = ''

Так как '1'='1' всегда истинно, злоумышленник сможет войти без пароля.

Виды SQL-инъекций

  • Классическая (In-Band) SQL-инъекция – результат атаки можно увидеть прямо в ответе веб-страницы.
  • Слепая (Blind) SQL-инъекция – сервер не возвращает явных ошибок, но можно узнать информацию путём анализа поведения.
  • Out-of-Band SQL-инъекция – выполняется через сторонние сервисы, например, при отправке данных на удалённый сервер.
  • Time-Based Blind SQL Injection – атака основана на измерении времени ответа сервера на определённые запросы.
  • Boolean-Based Blind SQL Injection – атака основана на анализе различий в ответах сервера при изменении условий запроса.

Методы атаки с использованием SQL-инъекций

🔹 Вывод всех данных из таблицы

SELECT * FROM users WHERE username = '' OR 1=1 --;

Этот запрос вернёт все данные из таблицы users, так как 1=1 всегда истинно.

🔹 Получение структуры базы данных

SELECT column_name FROM information_schema.columns WHERE table_name = 'users';

Этот запрос выдаст все названия колонок таблицы users, что позволит атакующему лучше понять структуру базы данных.

🔹 Изменение данных в таблице

UPDATE users SET password = 'hacked' WHERE username = 'admin';

Если у злоумышленника есть возможность выполнять подобные запросы, он может изменить пароли пользователей или другие критически важные данные.

🔹 Удаление таблицы

DROP TABLE users;

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

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

✅ Использование параметризованных запросов (Prepared Statements):

import sqlite3 conn = sqlite3.connect("database.db") cursor = conn.cursor() cursor.execute("SELECT * FROM users WHERE username = ? AND password = ?", (username, password))

✅ Экранирование пользовательского ввода (если параметризация недоступна):

import pymysql username = pymysql.escape_string(username) password = pymysql.escape_string(password)

✅ Использование ORM (Object-Relational Mapping) – такие фреймворки, как SQLAlchemy или Django ORM, автоматически защищают от SQL-инъекций.

✅ Ограничение прав пользователей БД – учетная запись приложения не должна иметь права удаления данных или изменения схемы БД.

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

✅ Использование веб-фаерволов (WAF) – специальные системы могут обнаруживать и блокировать попытки атак в реальном времени.

✅ Мониторинг и логирование – анализ логов может выявить подозрительные SQL-запросы.

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

Следование этим мерам поможет защитить вашу систему от атак и сохранить безопасность данных. 🚀

Dan Dasakami

Dan Dasakami

2 читателей отметили статью полезной

Комментарии

0
В
Будьте вежливы и по делу