Проанализируйте безопасность веб‑формы, где серверный PHP‑код выполняет запросы так:
$query = "SELECT * FROM users WHERE login = '$_POST[login]

29 Сен в 10:30
14 +1
0
Ответы
1

Коротко: такой код уязвим — это классическая SQL‑инъекция. Ниже — почему, какие риски и как это исправить.

Почему уязвимо

Вы напрямую вставляете данные из POSTвSQLбезфильтрацииилипараметризации.Этопозволяетзлоумышленнику«выйти»изстроковоголитералаиподставитьпроизвольнуюSQL‑часть.</li><li>Крометого,строкавпримереявнонеполная/небрежнооформлена(вставкамассивавдвойныекавычкиможетпривестиксинтаксическимнюансам).Нодажеприкорректномсинтаксисепроблемаостается.</li></ul><p>Примерырисков(кратко)</p><ul><li>Аутентификацияможнообойти(запросвернётнетогопользователя,еслиWHEREпревратитсяввсегдаистинноевыражение).</li><li>Чтение/изменение/удалениеданных(SELECT/UPDATE/DELETE)втаблицах.</li><li>Получениехэшейпаролей,персональныхданных,данныхкартит.д.</li><li>ВзависимостиотконфигурацииСУБД—запускнесколькихзапросовилиэскалацияпривилегий.</li><li>Утечкаошибоквответесервера(есливыпоказываетеSQL‑ошибки)поможетатакующему.</li></ul><p>Пример(объяснительно,безподробныхпошаговыхинструкций)</p><ul><li>Есливполеloginпридётстрока,закрывающаякавычкуидобавляющаялогическоеусловие(типично:OR′1′=′1′),условиеWHEREможетстатьвсегдаистиннымивернутьвсестроки.Этодемонстрируетклассическийпутьобходапроверки.</li></ul><p>Какправильнозащищать(рекомендуемыемеры)</p><ol><li><p>Параметризованныезапросы(preparedstatements)—первичныйисамыйнадёжныйспособ.</p><ul><li>PDO(рекомендуется):_POST в SQL без фильтрации или параметризации. Это позволяет злоумышленнику «выйти» из строкового литерала и подставить произвольную SQL‑часть.</li><li>Кроме того, строка в примере явно неполная/небрежно оформлена (вставка массива в двойные кавычки может привести к синтаксическим нюансам). Но даже при корректном синтаксисе проблема остается.</li></ul><p>Примеры рисков (кратко)</p><ul><li>Аутентификация можно обойти (запрос вернёт не того пользователя, если WHERE превратится в всегда истинное выражение).</li><li>Чтение/изменение/удаление данных (SELECT/UPDATE/DELETE) в таблицах.</li><li>Получение хэшей паролей, персональных данных, данных карт и т.д.</li><li>В зависимости от конфигурации СУБД — запуск нескольких запросов или эскалация привилегий.</li><li>Утечка ошибок в ответе сервера (если вы показываете SQL‑ошибки) поможет атакующему.</li></ul><p>Пример (объяснительно, без подробных пошаговых инструкций)</p><ul><li>Если в поле login придёт строка, закрывающая кавычку и добавляющая логическое условие (типично: OR '1'='1'), условие WHERE может стать всегда истинным и вернуть все строки. Это демонстрирует классический путь обхода проверки.</li></ul><p>Как правильно защищать (рекомендуемые меры)</p><ol><li><p>Параметризованные запросы (prepared statements) — первичный и самый надёжный способ.</p><ul><li>PDO (рекомендуется):
P OSTвSQLбезфильтрацииилипараметризации.Этопозволяетзлоумышленнику«выйти»изстроковоголитералаиподставитьпроизвольнуюSQLчасть.</li><li>Крометого,строкавпримереявнонеполная/небрежнооформлена(вставкамассивавдвойныекавычкиможетпривестиксинтаксическимнюансам).Нодажеприкорректномсинтаксисепроблемаостается.</li></ul><p>Примерырисков(кратко)</p><ul><li>Аутентификацияможнообойти(запросвернётнетогопользователя,еслиWHEREпревратитсяввсегдаистинноевыражение).</li><li>Чтение/изменение/удалениеданных(SELECT/UPDATE/DELETE)втаблицах.</li><li>Получениехэшейпаролей,персональныхданных,данныхкартит.д.</li><li>ВзависимостиотконфигурацииСУБДзапускнесколькихзапросовилиэскалацияпривилегий.</li><li>Утечкаошибоквответесервера(есливыпоказываетеSQLошибки)поможетатакующему.</li></ul><p>Пример(объяснительно,безподробныхпошаговыхинструкций)</p><ul><li>Есливполеloginпридётстрока,закрывающаякавычкуидобавляющаялогическоеусловие(типично:OR1=1),условиеWHEREможетстатьвсегдаистиннымивернутьвсестроки.Этодемонстрируетклассическийпутьобходапроверки.</li></ul><p>Какправильнозащищать(рекомендуемыемеры)</p><ol><li><p>Параметризованныезапросы(preparedstatements)первичныйисамыйнадёжныйспособ.</p><ul><li>PDO(рекомендуется):
pdo = new PDO(dsn,dsn, dsn,user, $pass, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
$stmt = $pdo->prepare('SELECT id, password_hash FROM users WHERE login = :login');
$stmt->execute(['login' => POST[′login′]]);_POST['login']]);
P OST[login]]);
user = $stmt->fetch(PDO::FETCH_ASSOC);mysqli:
$stmt = $mysqli->prepare('SELECT id, password_hash FROM users WHERE login = ?');
$stmt->bind_param('s', POST[′login′]);_POST['login']);
P OST[login]);
stmt->execute();
res=res = res=stmt->get_result();

Не использовать SELECT * — выбирайте только нужные столбцы (минимизация данных).

Не показывайте внутренние ошибки СУБД пользователю (логируйте, но не отдавайте стек/SQL).

Валидируйте и ограничивайте вход:

whitelist для логинов (например, только буквы, цифры, точки/подчёркивания).ограничение длины.при необходимости дополнительно фильтровать/нормализовать ввод.

Устанавливайте правильную кодировку соединения (utf8mb4) и используйте её и при подготовке запросов.

Применяйте минимальные привилегии для DB‑пользователя — только те операции, которые нужны приложению.

Храните пароли правильно — password_hash() и password_verify() (не храните пароли в открытом виде).

Логи, контроль доступа, ограничение частоты запросов и блокировка попыток (rate limiting, lockout, CAPTCHA) для снижения эффективности автоматических атак.

Валидация на сервере обязательна даже если есть клиентская валидация на фронте.

Рассмотрите использование ORM/фреймворка — они обычно скрывают прямые SQL и помогают избежать ошибок.

Если по каким‑то причинам не можете сразу переписать код на подготовленные выражения, как временная мера можно использовать mysqli_real_escape_string(), но это менее надёжно и требует правильного учёта кодировки — это не замена параметризации.

Короткий чек‑лист для быстрого аудита

Используются ли подготовленные запросы? Если нет — срочно исправить.Ограничен ли набор возвращаемых колонок? (нет SELECT *)Логи и ошибки не выводятся пользователю?Пароли хранятся как хэши?DB‑пользователь имеет минимальные права?Есть ли валидация/ограничение длины/whitelist на поле login?

Если хотите, могу:

Превратить ваш конкретный фрагмент кода в безопасный пример (PDO/mysqli).Проанализировать полный фрагмент вашего кода и дать конкретные правки.
29 Сен в 11:50
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир