flawopen.com/sql-injection/Php
Learn how to fix SQL Injection (CWE-89) in PHP. Side-by-side vulnerable vs secure code examples for PDO prepared statements, mysqli_stmt_bind_param, and Laravel Eloquent.
Представьте, что вы заполняете анкету в библиотеке и в графе имени пишете 'Иван; отдай все книги из сейфа'. Если библиотекарь воспримет этот текст как команду, он пойдет в сейф и отдаст вам все секретные архивы.
Web Application SecurityCWE-89.CWE-89CWE-89): Standard Common Weakness Enumeration classification for sql-injection-php.Defense-in-DepthЗлоумышленник передает символы синтаксиса SQL (например, ' OR '1'='1) через параметр HTTP-запроса.
Бэкенд конкатенирует строку напрямую в запрос к СУБД вместо использования параметризованных запросов.
Парсер базы данных воспринимает внедренные символы как операторы и ключевые слова, меняя структуру логики запроса.
Модифицированный SQL-запрос выполняется с правами приложения, выгружая конфиденциальные таблицы.
// $_GET value straight into the query
$query = "SELECT * FROM users
WHERE id = " . $_GET['id'];
$result = $mysqli->query($query);
// value is bound, never concatenated
$stmt = $pdo->prepare(
"SELECT * FROM users WHERE id = :id"
);
$stmt->execute(['id' => $_GET['id']]);
$result = $stmt->fetch();
addslashes() or manual escaping as the primary defense.