Код $query = "SELECT * FROM users WHERE name='".$_GET['name']."'"; рискует SQL‑инъекцией. Кратко — что может произойти и как исправить. Риски - Неавторизованный доступ к данным, утечка конфиденциальной информации. - Подмена/удаление/изменение записей в базе. - Атаки на целостность и доступность (включая удаление таблиц). - Эскалация привилегий и дальнейшее проникновение в систему. - Обход аутентификации (пример: логин под любым пользователем). Пример атаки (вставка в параметр name) Если в name придёт значение вида ' OR 'x'='x то итоговый запрос вернёт все строки — классическая инъекция. Надёжные решения (в порядке приоритета) 1) Параметризованные запросы (prepared statements) — основной и рекомендуемый метод. - PDO: ```php $pdo = new PDO($dsn, $user, $pass, $options); $stmt = $pdo->prepare("SELECT * FROM users WHERE name = ?"); $stmt->execute([$_GET['name']]); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); ``` - mysqli: ```php $mysqli = new mysqli($host, $user, $pass, $db); $stmt = $mysqli->prepare("SELECT * FROM users WHERE name = ?"); $stmt->bind_param("s", $_GET['name']); $stmt->execute(); $result = $stmt->get_result(); $rows = $result->fetch_all(MYSQLI_ASSOC); ``` 2) Белый список и валидация входных данных - Ограничьте допустимые символы (регулярные выражения) и длину поля; отклоняйте подозрительные значения. - Для полей с заранее известным набором значений — используйте перечисления/выпадающие списки, а не произвольный ввод. 3) Экранирование как запасной вариант - Если по какой‑то причине нельзя использовать параметризованные запросы, применяйте корректное экранирование (например, mysqli_real_escape_string), но это менее надёжно и удобно. 4) Минимальные привилегии у БД - Аккаунт приложения должен иметь только те права, которые реально нужны (например, только SELECT для чтения). 5) Дополнительные меры - Отключите возможность выполнения нескольких SQL‑запросов в одном вызове (multi statements), если не требуется. - Используйте ORM или высокоуровневые библиотеки, которые по умолчанию параметризуют запросы. - Включите логирование и мониторинг подозрительных запросов. - При необходимости — WAF (Web Application Firewall) как дополнительный уровень защиты. Короткое резюме Используйте параметризованные запросы (PDO или mysqli) + валидацию/ограничение входа + минимум привилегий. Экранирование и WAF — лишь дополнение, а не замена параметризации.
$query = "SELECT * FROM users WHERE name='".$_GET['name']."'";
рискует SQL‑инъекцией. Кратко — что может произойти и как исправить.
Риски
- Неавторизованный доступ к данным, утечка конфиденциальной информации.
- Подмена/удаление/изменение записей в базе.
- Атаки на целостность и доступность (включая удаление таблиц).
- Эскалация привилегий и дальнейшее проникновение в систему.
- Обход аутентификации (пример: логин под любым пользователем).
Пример атаки (вставка в параметр name)
Если в name придёт значение вида
' OR 'x'='x
то итоговый запрос вернёт все строки — классическая инъекция.
Надёжные решения (в порядке приоритета)
1) Параметризованные запросы (prepared statements) — основной и рекомендуемый метод.
- PDO:
```php
$pdo = new PDO($dsn, $user, $pass, $options);
$stmt = $pdo->prepare("SELECT * FROM users WHERE name = ?");
$stmt->execute([$_GET['name']]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
```
- mysqli:
```php
$mysqli = new mysqli($host, $user, $pass, $db);
$stmt = $mysqli->prepare("SELECT * FROM users WHERE name = ?");
$stmt->bind_param("s", $_GET['name']);
$stmt->execute();
$result = $stmt->get_result();
$rows = $result->fetch_all(MYSQLI_ASSOC);
```
2) Белый список и валидация входных данных
- Ограничьте допустимые символы (регулярные выражения) и длину поля; отклоняйте подозрительные значения.
- Для полей с заранее известным набором значений — используйте перечисления/выпадающие списки, а не произвольный ввод.
3) Экранирование как запасной вариант
- Если по какой‑то причине нельзя использовать параметризованные запросы, применяйте корректное экранирование (например, mysqli_real_escape_string), но это менее надёжно и удобно.
4) Минимальные привилегии у БД
- Аккаунт приложения должен иметь только те права, которые реально нужны (например, только SELECT для чтения).
5) Дополнительные меры
- Отключите возможность выполнения нескольких SQL‑запросов в одном вызове (multi statements), если не требуется.
- Используйте ORM или высокоуровневые библиотеки, которые по умолчанию параметризуют запросы.
- Включите логирование и мониторинг подозрительных запросов.
- При необходимости — WAF (Web Application Firewall) как дополнительный уровень защиты.
Короткое резюме
Используйте параметризованные запросы (PDO или mysqli) + валидацию/ограничение входа + минимум привилегий. Экранирование и WAF — лишь дополнение, а не замена параметризации.