SQL-инъекция — подстановка вредоносного SQL через пользовательский ввод.
Плохо:
$query = "SELECT * FROM users WHERE name = '$name'";
// name = "' OR '1'='1" → сломает всё
Правильно — подготовленные выражения (prepared statements):
// PDO:
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
$stmt->execute([':email' => $email]);
// MySQLi:
$stmt = $mysqli->prepare('SELECT * FROM users WHERE email = ?');
$stmt->bind_param('s', $email);
$stmt->execute();
Параметры никогда не попадают в SQL-текст — они передаются отдельно.
Дополнительно:
• Никогда не доверяй пользовательскому вводу
• Принцип минимальных привилегий для DB-пользователя
• ORM (Eloquent, Doctrine) использует prepared statements под капотом