0Pricing
PHP Academy · Lección

Inyección SQL y consultas parametrizadas

Elimine los riesgos de inyección utilizando siempre sentencias preparadas con PDO.

Inyección SQL y consultas parametrizadas es una lección gratuita de PHP Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de PHP Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de PHP Academy incluye 4 lecciones en total.

¿Qué es la inyección SQL?

La inyección SQL ocurre cuando los datos proporcionados por el usuario se insertan directamente en una consulta SQL, lo que permite a los atacantes manipularla para acceder a datos, modificarlos o eliminarlos.

Ejemplo clásico

Concatenar la entrada del usuario en SQL:

<?php
// VULNERABLE: attacker enters username = "' OR '1'='1"
$sql = "SELECT * FROM users WHERE username = '".$_GET["username"]."'";
// Becomes: SELECT * FROM users WHERE username = '' OR '1'='1'
// Returns ALL users!

Ejemplo de exfiltración de datos

Un atacante utiliza UNION SELECT para extraer datos de otras tablas.

// Input: ' UNION SELECT username, password FROM admin_users--
// This appends a second SELECT returning admin credentials

Las consultas preparadas son la solución

Con las consultas preparadas, la estructura de la consulta se fija antes de proporcionar los datos. La base de datos trata todos los valores enlazados como datos literales, nunca como código SQL.

<?php
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$_GET["username"]]);
// Safe even if username = "' OR 1=1--"

Marcadores de posición con nombre

Los marcadores de posición con nombre son más claros, especialmente cuando hay varios parámetros.

<?php
$stmt = $pdo->prepare(
    "SELECT * FROM users WHERE email = :email AND active = :active"
);
$stmt->execute([":email" => $email, ":active" => true]);

Eloquent es seguro de forma predeterminada

Laravel Eloquent utiliza internamente consultas preparadas de PDO para todas las operaciones estándar del constructor de consultas.

<?php
// Safe:
User::where("email", $email)->first();

// UNSAFE: raw query with user input!
DB::select("SELECT * FROM users WHERE email = ".$email);

Consultas sin procesar

Cuando deba utilizar SQL sin procesar en Laravel, use siempre vinculaciones de parámetros.

<?php
// Safe raw query:
$users = DB::select("SELECT * FROM users WHERE email = ?", [$email]);

// Or with named bindings:
$users = DB::select("SELECT * FROM users WHERE email = :email", [":email" => $email]);

Inyección en la cláusula LIKE

Las cláusulas LIKE requieren un tratamiento especial: los caracteres comodín (%, _) deben escaparse manualmente antes de enlazar los parámetros.

<?php
$search = str_replace(["%", "_", "\\"], ["\%", "\_", "\\\\"], $userInput);
$stmt = $pdo->prepare("SELECT * FROM products WHERE name LIKE ?");
$stmt->execute(["%$search%"]);

Inyección en ORDER BY

Los nombres de columna y las direcciones de ORDER BY no se pueden parametrizar. Valídelos con una lista de permitidos.

<?php
$allowedColumns = ["name", "price", "created_at"];
$col = in_array($request->sort, $allowedColumns) ? $request->sort : "name";
$dir = $request->dir === "desc" ? "desc" : "asc";
// Then safely build the query string

Procedimientos almacenados

Los procedimientos almacenados también pueden ser vulnerables si concatenan internamente la entrada. Utilice siempre llamadas parametrizadas.

Principio de mínimo privilegio

El usuario de la base de datos que se conecta desde PHP solo debe tener permisos SELECT/INSERT/UPDATE/DELETE en las tablas necesarias, nunca privilegios CREATE, DROP ni de administración.

Resumen

Use SIEMPRE consultas preparadas con parámetros enlazados. No concatene nunca la entrada del usuario en SQL. Valide ORDER BY y los nombres de columna con una lista de permitidos. Use PDO con las consultas preparadas emuladas desactivadas.

Comprobación rápida

¿Cuál es la forma correcta de protegerse contra la inyección SQL?

Preguntas frecuentes

¿La lección «Inyección SQL y consultas parametrizadas» es gratis?

Sí — el texto completo de «Inyección SQL y consultas parametrizadas» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de PHP Academy, actualiza a CoddyKit PRO. El curso de PHP Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Inyección SQL y consultas parametrizadas»?

Elimine los riesgos de inyección utilizando siempre sentencias preparadas con PDO. Practicas PHP Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar PHP Academy?

No se requiere experiencia previa. PHP Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «Inyección SQL y consultas parametrizadas»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de PHP Academy?

Sí. Cada lección de PHP Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Prevención de cross-site scripting (XSS)
  2. Inyección SQL y consultas parametrizadas
  3. Protección contra CSRF
  4. Almacenamiento seguro de contraseñas
← Volver a PHP Academy