flawopen.com/sql-injection/Php

● CWE-89 · Crítica
Investigación · FlawOpen

SQL Injection in 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.

💡 Explicación en Lenguaje Sencillo (ELI5)

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.

Conceptos Clave y Términos

Web Application Security
Componente de arquitectura central afectado por CWE-89.
CWE-89
Clasificación estándar Common Weakness Enumeration (CWE) para sql-injection-php.
Defense-in-Depth
Verificación de ingeniería multicapa y aislamiento de límites en tiempo de ejecución.

Flujo de Ataque Paso a Paso

Step 1

Envío de Parámetro SQL No Confiable

El atacante envía caracteres de control SQL (ej. ' OR '1'='1) dentro de un parámetro de solicitud HTTP.

Step 2

Concatenación Dinámica de Consultas

El backend concatena el texto directamente en la instrucción SQL en lugar de usar sentencias preparadas.

Step 3

Manipulación del Árbol Sintáctico (AST)

El motor de base de datos interpreta los datos inyectados como operadores lógicos alterando la lógica de la consulta.

Step 4

Exfiltración de Datos o Evasión de Acceso

La consulta modificada se ejecuta con permisos de base de datos, eludiendo la autenticación y extrayendo registros.

Código Fuente: Vulnerable vs. Seguro

✕ IMPLEMENTACIÓN VULNERABLE
// $_GET value straight into the query
$query = "SELECT * FROM users
  WHERE id = " . $_GET['id'];
$result = $mysqli->query($query);
✓ PARCHE SEGURO Y ROBUSTO
// value is bound, never concatenated
$stmt = $pdo->prepare(
  "SELECT * FROM users WHERE id = :id"
);
$stmt->execute(['id' => $_GET['id']]);
$result = $stmt->fetch();

Lista de Verificación de Seguridad para Ingeniería

References