Уязвимость: SQL‑инъекция. Причина: значение из `$_GET['name']` вставляется напрямую в SQL‑строку без экранирования или параметризации, поэтому злоумышленник может подставить символы SQL (например, кавычку и дополнительные условия), изменив логику запроса и получив неавторизованный доступ к данным. Пример сути атаки: если пользовательский ввод закрывает строковый литерал и добавляет условие/оператор, итоговый SQL меняется — это позволяет обойти фильтры или вытащить/изменить данные. Как исправить (рекомендуется): - Использовать подготовленные выражения (parameterized queries). Пример с PDO: <?php $pdo = new PDO($dsn, $user, $pass, $opts); $stmt = $pdo->prepare("SELECT * FROM users WHERE name = :name"); $stmt->execute([':name' => $_GET['name']]); $rows = $stmt->fetchAll(); ?>
- Или mysqli с bind_param. - Дополнительно: валидировать/ограничивать вход (регулярные выражения или белый список допустимых символов), минимизировать права БД-пользователя, не выводить подробные ошибки БД пользователям. Избегайте только экранирования вручную (например, ненадежных реализаций) — предпочтительны подготовленные запросы.
Причина: значение из `$_GET['name']` вставляется напрямую в SQL‑строку без экранирования или параметризации, поэтому злоумышленник может подставить символы SQL (например, кавычку и дополнительные условия), изменив логику запроса и получив неавторизованный доступ к данным.
Пример сути атаки: если пользовательский ввод закрывает строковый литерал и добавляет условие/оператор, итоговый SQL меняется — это позволяет обойти фильтры или вытащить/изменить данные.
Как исправить (рекомендуется):
- Использовать подготовленные выражения (parameterized queries). Пример с PDO:
<?php
$pdo = new PDO($dsn, $user, $pass, $opts);
$stmt = $pdo->prepare("SELECT * FROM users WHERE name = :name");
$stmt->execute([':name' => $_GET['name']]);
$rows = $stmt->fetchAll();
?> - Или mysqli с bind_param.
- Дополнительно: валидировать/ограничивать вход (регулярные выражения или белый список допустимых символов), минимизировать права БД-пользователя, не выводить подробные ошибки БД пользователям.
Избегайте только экранирования вручную (например, ненадежных реализаций) — предпочтительны подготовленные запросы.