Esto es no de qué se trata la inyección SQL. Cada vez que usa parámetros que no se han desinfectado en su consulta SQL, deja su base de datos abierta a la inyección de SQL, que no necesariamente tiene el objetivo de destruir datos. También podría ser para robar datos u obtener acceso no autorizado.
Considere una cuenta muy restringida donde todo lo que podría hacer es SELECT
. Escribes una consulta para autenticación:
$sql = "SELECT COUNT(*) AS count
FROM users
WHERE user_id='{$_POST['user']}' AND pass='{$_POST['password'}'";
// check if returns a count of 1, if yes, log in
Con una entrada normal, espera que la consulta se vea así:
SELECT COUNT(*) AS count
FROM users
WHERE user_id = 'username' AND pass='********'
Que debería devolver 1 como el recuento si tanto el nombre de usuario como el pase coinciden. Ahora un atacante intenta iniciar sesión como administrador. Como no ha desinfectado sus entradas, envían $_POST['user']
como:admin'; --
. La consulta completa se convierte en:
SELECT COUNT(*) AS count
FROM users
WHERE user_id = 'admin'; -- AND pass='********'
Todo después de --
es un comentario, por lo que ignora la otra condición y devuelve 1 independientemente. Ahí lo tienes, acabas de otorgar acceso de administrador a un usuario malicioso. Así es como se llevan a cabo algunos ataques reales. Comienza con una cuenta con pocos privilegios y, a través de agujeros en la seguridad, intenta obtener acceso a más privilegios.
Para resumir, tener una cuenta para toda la aplicación con privilegios restringidos (p. ej., no DROP
, ALTER
, etc) es bueno. Nunca le dé a nadie ni a ninguna aplicación más privilegios de los que necesita. Pero para evitar la inyección de SQL, use declaraciones preparadas
.