Проанализируйте PHP-пример: $query = "SELECT * FROM users WHERE email = '" . $_GET['email'] . "'"; $res = mysqli_query($conn, $query); — какие угрозы безопасности присутствуют, как защититься от SQL-инъекций и какие дополнительные меры безопасности для ввода пользователя вы бы рекомендовали?

19 Мар в 12:09
17 +1
0
Ответы
1
Коротко и по делу.
Что не так в примере
- Прямая конкатенация пользовательского ввода в SQL: SQL-инъекция (удалённое выполнение/чтение/изменение данных, обход аутентификации, раскрытие схемы).
- Отсутствие валидации формата (можно подать невалидный или специально сформированный ввод).
- Возможна утечка ошибок БД пользователю (информация для атакующих).
- Если вход потом выводится в HTML — риск XSS при отсутствии экранирования.
Как защититься от SQL-инъекций (рекомендации)
- Использовать параметризованные запросы / подготовленные выражения (prepared statements). Примеры:
mysqli:
$stmt = $conn->prepare("SELECT * FROM users WHERE email = ?");
$stmt->bind_param('s', $_GET['email']);
$stmt->execute();
$res = $stmt->get_result();
PDO:
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = :email");
$stmt->execute([':email' => $_GET['email']]);
$res = $stmt->fetchAll();
- Не полагаться на ручную экранизацию, но при крайней необходимости использовать mysqli_real_escape_string как временную меру.
- Устанавливать кодировку соединения: mysqli_set_charset($conn, 'utf8mb4') — чтобы исключить баги с кодировками.
Дополнительные меры безопасности для ввода пользователя
- Валидировать и нормализовать ввод: например, проверять email через filter_var($_GET['email'], FILTER_VALIDATE_EMAIL) и обрезать пробелы.
- Ограничивать длину поля (для email допустимая верхняя граница — 320320320 символов по стандарту; на практике можно ещё строже).
- Возвращать только нужные колонки вместо SELECT * (минимизация утечки данных).
- Ограничивать привилегии учётной записи БД (least privilege): если только чтение — дать только SELECT и доступ к нужной базе/таблицам.
- Не показывать подробные ошибки БД пользователю; логировать их на сервере.
- Экранировать вывод в HTML (htmlspecialchars) чтобы избежать XSS.
- Защита на уровне инфраструктуры: WAF, лимиты скорости запросов, мониторинг подозрительной активности и блокировка по IP.
- Использовать HTTPS, CSRF-защиту для чувствительных действий, и хранить логины/токены безопасно.
Краткая инструкция — минимальный безопасный вариант
1) Валидировать email; 2) использовать подготовленный запрос; 3) ограничить возвращаемые поля и права БД; 4) не показывать подробные ошибки; 5) экранировать вывод.
19 Мар в 12:55
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир