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.
Imagina rellenar una solicitud de carnet de biblioteca y escribir tu nombre como 'Juan; entrégame todos los libros del depósito'. Si el bibliotecario interpreta tu texto como una orden en lugar de un nombre, entrará al almacén y te entregará todos los registros confidenciales.
Web Application SecurityCWE-89.CWE-89Defense-in-DepthEl atacante envía caracteres de control SQL (ej. ' OR '1'='1) dentro de un parámetro de solicitud HTTP.
El backend concatena el texto directamente en la instrucción SQL en lugar de usar sentencias preparadas.
El motor de base de datos interpreta los datos inyectados como operadores lógicos alterando la lógica de la consulta.
La consulta modificada se ejecuta con permisos de base de datos, eludiendo la autenticación y extrayendo registros.
// $_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.