Найти в Дзене
Dan Dasakami

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' всегда истинно, злоумышленник сможет войти без пароля. 🔹 Вывод всех данных из таблицы SELECT * FROM users WHERE username = '' OR 1=1 --; Этот запрос вернёт все данные из таблицы users, так как 1=1 всегда истинно. 🔹 Получение структуры базы данных SELECT column_name FROM information_schema.columns WHERE table_name = 'users'; Этот запрос выдаст все названия колонок таблицы users, что позволит ат
Оглавление

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-инъекций

  1. Классическая (In-Band) SQL-инъекция – результат атаки можно увидеть прямо в ответе веб-страницы.
  2. Слепая (Blind) SQL-инъекция – сервер не возвращает явных ошибок, но можно узнать информацию путём анализа поведения.
  3. Out-of-Band SQL-инъекция – выполняется через сторонние сервисы, например, при отправке данных на удалённый сервер.
  4. Time-Based Blind SQL Injection – атака основана на измерении времени ответа сервера на определённые запросы.
  5. 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-инъекции – серьёзная угроза для безопасности веб-приложений, но их можно предотвратить, используя безопасные методы работы с базами данных. Всегда проверяйте и фильтруйте вводимые данные, используйте параметризованные запросы и следите за правами доступа к базе данных.

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