Найдите уязвимость в PHP-фрагменте: $query = "SELECT * FROM users WHERE name = '" . $_GET['name'] . "'"; — какие атаки возможны, как исправить запрос и какие практики следует применить для предотвращения инъекций и других веб-уязвимостей
Уязвимость - Это классический SQL‑инъекшн: строка из `$_GET['name']` вставляется в SQL без обработки, так что атакующий может подставить произвольный SQL. Какие атаки возможны (примеры полезных полезностей) - Аутентификация/обход фильтров: ` ' OR '1'='1' -- ` — вернёт все записи. - Утечка данных через UNION: ` ' UNION SELECT username, password FROM admin -- ` - Деструктивные операции: ` '; DROP TABLE users; -- ` - Блайнд‑инъекции для экстракции данных, time‑based payloads и т. п. Как исправить запрос (рекомендуемый способ) - Использовать подготовленные выражения (parameterized queries) и привязку параметров. Примеры. PDO: ``` $stmt = $pdo->prepare("SELECT * FROM users WHERE name = :name"); $stmt->execute(['name' => $_GET['name']]); $user = $stmt->fetch(); ``` mysqli: ``` $stmt = $mysqli->prepare("SELECT * FROM users WHERE name = ?"); $stmt->bind_param('s', $_GET['name']); $stmt->execute(); $result = $stmt->get_result(); ``` Дополнительные меры против инъекций и других веб‑уязвимостей (рекомендации) - Валидировать вход: whitelist (разрешённые символы/формат, длина). Пример: ограничить до допустимых букв/длин. - Не формировать SQL конкатенацией; всегда параметры. - Ограничить привилегии БД: пользователь приложения должен иметь минимальные права (только SELECT/INSERT/UPDATE по необходимости). - Кодирование/экранирование при выводе (HTML‑encoding) — предотвращение XSS. - Использовать HTTPS, Secure и HttpOnly для cookie, CSRF‑токены для форм. - Логи и мониторинг подозрительных запросов; rate limiting на критичные эндпойнты. - Не показывать детальные ошибки пользователю; централизованная обработка ошибок. - Обновления зависимостей, статический/динамический сканинг приложений (SAST/DAST), WAF при необходимости. - Использовать ORM или фреймворк с встроенной защитой, но знать их ограничения. - Для паролей — хранить хеши сильным алгоритмом (bcrypt/argon2), не в базе открытым текстом. Краткое правило безопасности: никогда не доверяйте входу — фильтруйте, параметризуйте запросы, минимизируйте привилегии и кодируйте вывод.
- Это классический SQL‑инъекшн: строка из `$_GET['name']` вставляется в SQL без обработки, так что атакующий может подставить произвольный SQL.
Какие атаки возможны (примеры полезных полезностей)
- Аутентификация/обход фильтров: ` ' OR '1'='1' -- ` — вернёт все записи.
- Утечка данных через UNION: ` ' UNION SELECT username, password FROM admin -- `
- Деструктивные операции: ` '; DROP TABLE users; -- `
- Блайнд‑инъекции для экстракции данных, time‑based payloads и т. п.
Как исправить запрос (рекомендуемый способ)
- Использовать подготовленные выражения (parameterized queries) и привязку параметров. Примеры.
PDO:
```
$stmt = $pdo->prepare("SELECT * FROM users WHERE name = :name");
$stmt->execute(['name' => $_GET['name']]);
$user = $stmt->fetch();
```
mysqli:
```
$stmt = $mysqli->prepare("SELECT * FROM users WHERE name = ?");
$stmt->bind_param('s', $_GET['name']);
$stmt->execute();
$result = $stmt->get_result();
```
Дополнительные меры против инъекций и других веб‑уязвимостей (рекомендации)
- Валидировать вход: whitelist (разрешённые символы/формат, длина). Пример: ограничить до допустимых букв/длин.
- Не формировать SQL конкатенацией; всегда параметры.
- Ограничить привилегии БД: пользователь приложения должен иметь минимальные права (только SELECT/INSERT/UPDATE по необходимости).
- Кодирование/экранирование при выводе (HTML‑encoding) — предотвращение XSS.
- Использовать HTTPS, Secure и HttpOnly для cookie, CSRF‑токены для форм.
- Логи и мониторинг подозрительных запросов; rate limiting на критичные эндпойнты.
- Не показывать детальные ошибки пользователю; централизованная обработка ошибок.
- Обновления зависимостей, статический/динамический сканинг приложений (SAST/DAST), WAF при необходимости.
- Использовать ORM или фреймворк с встроенной защитой, но знать их ограничения.
- Для паролей — хранить хеши сильным алгоритмом (bcrypt/argon2), не в базе открытым текстом.
Краткое правило безопасности: никогда не доверяйте входу — фильтруйте, параметризуйте запросы, минимизируйте привилегии и кодируйте вывод.