Это уязвимо к SQL‑инъекции: переменные вставляются прямо в строку запроса, поэтому злоумышленник может изменить логику WHERE. Пример полезной нагрузки: username = `' OR '1'='1' --` — это сделает условие истинным ( 1=11=11=1 ), и запрос вернёт записи независимо от пароля. Как исправить (кратко): 1) Использовать подготовленные выражения (parameterized queries). Пример на PDO: $pdo = new PDO(...); $stmt = $pdo->prepare("SELECT * FROM users WHERE name = :name"); $stmt->execute(['name' => $username]); $row = $stmt->fetch(); 2) Не хранить пароли в открытом виде — хранить хэш и проверять через безопасные функции: - при регистрации: $hash = password_hash($password, PASSWORD_DEFAULT); - при входе: получить хэш из БД и проверить: if (password_verify($password, $hash)) { /* ok */ } 3) Не полагаться на простое экранирование; использовать минимальные привилегии БД и логирование подозрительных попыток. Если нужно, вышлю конкретный пример исправления вашего кода (PDO или mysqli).
Как исправить (кратко):
1) Использовать подготовленные выражения (parameterized queries). Пример на PDO:
$pdo = new PDO(...);
$stmt = $pdo->prepare("SELECT * FROM users WHERE name = :name");
$stmt->execute(['name' => $username]);
$row = $stmt->fetch();
2) Не хранить пароли в открытом виде — хранить хэш и проверять через безопасные функции:
- при регистрации: $hash = password_hash($password, PASSWORD_DEFAULT);
- при входе: получить хэш из БД и проверить: if (password_verify($password, $hash)) { /* ok */ }
3) Не полагаться на простое экранирование; использовать минимальные привилегии БД и логирование подозрительных попыток.
Если нужно, вышлю конкретный пример исправления вашего кода (PDO или mysqli).