Ответ
SQL-инъекция (SQL Injection) — это критическая уязвимость веб-безопасности, возникающая, когда злоумышленник может внедрить произвольный SQL-код в запросы приложения к базе данных. Причина — некорректная обработка или отсутствие валидации пользовательского ввода.
Пример уязвимого кода (PHP):
// Пользовательский ввод напрямую подставляется в запрос
$username = $_POST['username']; // Например: `admin' --`
$password = $_POST['password'];
$sql = "SELECT * FROM users WHERE username='$username' AND password='$password'";
// Итоговый запрос: SELECT * FROM users WHERE username='admin' --' AND password='...'
// Комментарий `--` отменяет проверку пароля, позволяя войти как admin.
Более опасный пример — удаление данных:
Ввод: `'; DROP TABLE users; --`
Запрос: SELECT * FROM users WHERE username=''; DROP TABLE users; --' ...
Методы защиты:
- Использование подготовленных выражений (Prepared Statements) с параметризованными запросами — самый эффективный способ.
// Java (JDBC) пример String sql = "SELECT * FROM users WHERE username = ? AND password = ?"; PreparedStatement stmt = connection.prepareStatement(sql); stmt.setString(1, username); // Данные безопасно "привязываются" stmt.setString(2, password); ResultSet rs = stmt.executeQuery(); // Внедрение невозможно - Использование ORM (Hibernate, Entity Framework) — они генерируют параметризованные запросы.
- Экранирование специальных символов (менее надежно, чем prepared statements).
- Принцип минимальных привилегий: Учётная запись БД для приложения должна иметь только необходимые права (никакого
DROP,DELETEбез необходимости). - Валидация и санитизация ввода: Проверка данных по белому списку допустимых символов.
Для тестировщика (QA): Проверка на SQLi входит в пентест. Используются инструменты вроде sqlmap или ручная подстановка payloads (', ' OR '1'='1, '; SLEEP(5)--) в поля форм и параметры URL.