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 credentialsLas 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 stringProcedimientos 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
- Prevención de cross-site scripting (XSS)
- Inyección SQL y consultas parametrizadas
- Protección contra CSRF
- Almacenamiento seguro de contraseñas