Easier to read with cream paper, a tint, more contrast or larger text? Choose your colours and text, once, for every page.

Vista previa

Consultas seguras

Esta es la primera página de la lección. Léela y prueba las actividades. El resto está en el curso completo.

40 minutos

Un buscador que enseña de más

La tienda del club vende camisetas. Hay un buscador: escribes un nombre y salen las camisetas.

Una persona escribe una frase rara y de pronto ve todos los productos, incluidos los que estaban ocultos.

No ha adivinado ninguna clave. Ha engañado a la consulta. Hoy aprendes a evitarlo.

Palabras clave

PalabraQué significaEjemplo
Inyección de SQLUn ataque: el visitante escribe SQL en un campo y el servidor lo ejecuta.x' OR '1'='1
Consulta preparadaUna consulta que se envía primero con huecos y después con los datos.$pdo->prepare($sql)
MarcadorUn hueco en la consulta donde irá un dato. Se escribe con un signo ?.WHERE name = ?
ParámetroEl dato que ocupa un marcador. Viaja aparte de la consulta.$stmt->execute([$name])
Lista permitidaLos únicos valores que aceptas. Vale para columnas y orden."price" o "name"
EscaparCambiar los signos especiales de un texto antes de escribirlo en la página.htmlspecialchars($name)

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Qué es una inyección de SQL

Una consulta es un texto. Si pegas dentro de ese texto lo que escribió el visitante, él puede cambiar la consulta.

Con unas comillas y la palabra OR consigue que la condición sea siempre verdadera.

Mira cómo queda la consulta con un dato de ese tipo.

Pruébalo: la consulta mal hecha

Código: php
<?php
// MAL: se pega lo que escribe el visitante dentro de la consulta.
$name = "x' OR '1'='1";
$sql = "SELECT * FROM shirt WHERE name = '" . $name . "'";
echo $sql . "\n";

// Cambia $name por "Bufanda" y mira la consulta.

Pruébalo: lo que haría la base de datos

Código: sql
-- Esta es la consulta de antes, ya montada.
SELECT * FROM shirt WHERE name = 'x' OR '1'='1';

-- Ahora busca solo la bufanda.
-- SELECT * FROM shirt WHERE name = 'Bufanda';

Ejemplo resuelto: tres búsquedas

Lo que escribePegado en la consultaCon un marcador
BufandaSale 1 camiseta: la bufandaSale 1: busca ese nombre
x' OR '1'='1Salen las 4: la condición siempre es verdaderaSalen 0: ningún nombre es esa frase
Camiseta localSalen 2: las dos localesSalen 2: busca ese nombre

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

La defensa: consultas preparadas

En una consulta preparada primero envías la consulta con huecos. Los huecos se escriben con ?.

Después envías los datos por separado. La base de datos ya sabe qué es SQL y qué es un dato, así que nunca los mezcla.

Da igual lo que escriba el visitante: siempre es un dato.

Una consulta preparada con PDO

Código: php
<?php
// Los signos ? son marcadores: aquí irán los datos, pero por otro camino.
$sql = "SELECT id, name, price FROM shirt WHERE category = ? AND price <= ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$category, $maxPrice]);
$rows = $stmt->fetchAll();

// También puedes ponerles nombre.
$sql = "SELECT id, name FROM shirt WHERE category = :category";
$stmt = $pdo->prepare($sql);
$stmt->execute(["category" => $category]);

Pruébalo: la consulta segura

Código: php
<?php
// Devuelve la consulta con un marcador y los datos aparte.
function safeQuery(string $name): array {
    return ["sql" => "SELECT * FROM shirt WHERE name = ?", "params" => [$name]];
}

$query = safeQuery("x' OR '1'='1");
echo $query["sql"] . "\n";
echo "Parámetro: " . $query["params"][0] . "\n";

// La consulta no cambia, sea lo que sea lo que escriba el visitante.

Repaso rápido: la defensa

Inténtalo

Repaso rápido: la defensa

3 preguntas
Pruébalo: tus respuestas se corrigen aquí y después se olvidan. Inicia sesión si quieres que se guarde tu puntuación y continuar donde lo dejaste.Iniciar sesión para guardar tu puntuación

Tus respuestas se corrigen aquí y no se guardan. Una cuenta guarda tus resultados.

La lección continúa

7 partes más de esta lección están en el curso completo, con los ejercicios y la comprobación final. Una cuenta te da todo.