Как защитить веб-сервис от 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 уязвимостей

Устранение SQL уязвимостей