Как защитить веб-сервис от SQL-инъекций: 6 ключевых методов
SQL-инъекции остаются одной из самых опасных уязвимостей в веб-приложениях. Они позволяют злоумышленникам выполнять произвольные SQL-запросы к базе данных, что может привести к утечке данных, их изменению или даже удалению. Вот проверенные методы защиты:
1. Подготовленные выражения (Prepared Statements)
Всегда используйте параметризованные запросы. Это позволяет отделить SQL-код от данных, что предотвращает возможность внедрения вредоносного кода. Например:
// PHP пример с PDO
$stmt = $pdo->prepare('SELECT * FROM users WHERE email =:email');
$stmt->execute(['email' => $userInput]);
В этом примере переменная $userInput
не может изменить структуру SQL-запроса, так как она передается как параметр.
2. ORM-библиотеки
Используйте ORM (Object-Relational Mapping) библиотеки, такие как Eloquent (Laravel), SQLAlchemy (Python) или Hibernate (Java). Эти библиотеки автоматически экранируют данные и генерируют безопасные SQL-запросы. Например, в Eloquent вы можете написать:
// Пример с Eloquent
$user = User::where('email', $userInput)->first();
Здесь $userInput
будет безопасно обработан, и риск SQL-инъекций минимален.
3. Валидация ввода
Фильтруйте специальные символы и проверяйте данные по шаблонам (регулярным выражениям). Например, если вы ожидаете, что пользователь введет только адрес электронной почты, используйте регулярное выражение для проверки:
if (preg_match('/^[\w\.-]+@[\w\.-]+\.\w+$/', $userInput)) {
// Ввод корректен
}
Это поможет предотвратить ввод нежелательных символов и потенциально вредоносных данных.
4. Минимальные привилегии БД
Учётная запись приложения не должна иметь прав на выполнение опасных операций, таких как DROP
, ALTER
и другие. Создайте отдельного пользователя базы данных с минимальными правами, необходимыми для работы приложения. Например:
GRANT SELECT, INSERT, UPDATE ON my_database.* TO 'app_user'@'localhost';
Это ограничит возможности злоумышленника в случае успешной атаки.
5. Web Application Firewall
Настройте WAF (например, ModSecurity) для блокировки подозрительных запросов. WAF может анализировать входящий трафик и блокировать запросы, которые выглядят как попытки SQL-инъекций. Например, вы можете настроить правила для блокировки запросов, содержащих ключевые слова, такие как UNION
или SELECT
.
6. Регулярные обновления
Своевременно обновляйте СУБД и библиотеки работы с БД. Уязвимости часто исправляются в новых версиях программного обеспечения, поэтому важно вовремя обновлять ПО.
📝 Задания на закрепление
Поиск и использование SQL уязвимостей
- Взлом аккаунта
- Взлом легенды
- Error-based уязвимость
- Union Select уязвимость 1
- Union Select уязвимость 2
Устранение SQL уязвимостей