sql >> Base de Datos >  >> RDS >> Mysql

Protección de inyección SQL

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 .