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

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-инъекции – серьёзная угроза для безопасности веб-приложений, но их можно предотвратить, используя безопасные методы работы с базами данных. Всегда проверяйте и фильтруйте вводимые данные, используйте параметризованные запросы и следите за правами доступа к базе данных.
Следование этим мерам поможет защитить вашу систему от атак и сохранить безопасность данных. 🚀
Комментарии
0