El fundamento de SQL injection

 Estoy convencido de que si lo piensas detenidamente coincidirás conmigo en que, usualmente, la finalidad de nuestras aplicaciones es la de servir  a nuestros usuarios de interfaz para  el manejo de extensas bases de datos. Estas bases de datos están diseñadas para facilitar la consulta y el transporte de información hacia el usuario y, en sentido opuesto, para recibir y almacenar información entregada por el mismo. Cada vez que un usuario consulta o envía información a la base de datos de tu aplicación, está participando en la construcción de un código que ejecutará una acción en dicha base de datos. Ahora que hemos dicho esto, pregúntate ¿podría un usuario ilegítimo aprovechar esta pequeña participación para desvirtuar el código y hackear tu base de datos?.

 La respuesta obviamente es sí, y un método para llegar a conseguirlo es aprovechar esa pequeña participación que le has otorgado a tus usuarios para inyectar código SQL, es decir, a través de una técnica denominada SQL injection. Funciona de un modo sencillo que te paso a ilustrar. Imagina una base de datos que almacena información de animales. Tus usuarios pueden consultarla a través de un formulario web donde deben indicar la especie y, posteriormente, nosotros vamos a recoger esa petición con el código $especie = $_POST[‘especie’]. Una vez que disponemos de la especie que le interesa al usuario, lo usamos para generar la siguiente consulta a la base de datos:

$consulta = “SELECT * FROM animales WHERE especie= ‘$especie’”;

Si introducimos la palabra mamífero en el formulario de esta aplicación, se traducirá en la siguiente consulta:

$consulta = “SELECT * FROM animales WHERE especie= ‘mamífero’”;

 Hasta aquí el funcionamiento es el esperado, pero ¿y si introducimos la cadena mamífero’ OR 1=1?

 Volvemos a traducir la consulta resultante:

$consulta = “SELECT * FROM animales WHERE especie= ‘mamífero’ OR 1=1”;

 Ahora, recibiremos la información de todos los animales contenidos en la base de datos, pues usando la comilla sencilla, hemos desvirtuado el código de la consulta, y el condicionante 1=1 que hemos conseguido inyectar se cumple siempre. Este es el fundamento de SQL injection.