Cuando hablamos de una inyección SQL, automáticamente nuestra mente nos sitúa en un artefacto médico que inyecta código SQL en nuestro organismo con efectos devastadores. Y es que este símil no se separa mucho de la realidad. Las inyecciones SQL constituyen la mayor amenaza de nuestros proyectos web y hay que saber estar prevenido ante esta amenaza que es, más común, de lo que muchos desarrolladores creen. Esto es como muchas enfermedades, perdonad por el símil otra vez, en las que crees que solo les pasa a otras personas, hasta el día que, por sorpresa, te toca a ti. No hay que andarse con chiquitas. Una inyección SQL en tu sitio web puede echar abajo una base de datos completa, con la consiguiente pérdida de información. Si no contamos con un sistema de backups, puedes dar por hecho que el proyecto se ha ido al garete sin posibilidad de recuperar la información perdida. Adios información, hola decepción.
No hace falta recordar que, para nuestros clientes, la información recabada en un sitio web es vital para el mantenimiento de una web. Es por eso que hay que defenderse con uñas y dientes ante esta vulnerabilidad, y hoy te explicamos cómo.
Las inyecciones sql son realizadas por hackers que buscan vulnerabilidades en las peticiones POST o GET de un sitio web. Por regla general, dichas peticiones más tarde se pasan como parámetros a alguna consulta SQL para la inserción, edició, borrado o consulta de información. Pongamos dos casos bien diferenciados. Imaginemos que hemos desarrollado un blog. En él, para acceder a la vista de los artículos, pasamos el ID del mismo por url via GET. Después, lo recibiremos en el sistema y haremos la consulta en base de datos sobre el artículo del ID que recibimos por GET. Otro caso distinto, imaginemos que tenemos un formulario de registro en nuestro sitio web. Los campos que se enviarán por POST será introducidos directamente en la tabla de usuarios dentro de la base de datos. Sabéis a lo que me refiero ya, ¿verdad? Pues de esto es de lo que se aprovechan los hackers con sus inyecciones SQL. Adulteran el contenido de las peticiones, generando nuevas sentencias, para crackear la base de datos y corromperla.
Vale, se que me estoy poniendo en lo peor. Muchas de las inyecciones SQL no pretenden acabar con toda la información de la base de datos, sino tener acceso a toda la información de la aplicación objetivo a través de la gestión de información. Aunque no se qué es peor, o que tengan acceso directo a todos los datos de nuestra BD, incluso los más comprometidos como los datos personales de usuarios, o bien que destruyan campos, tablas e incluso la BD entera...
Cómo reconocer una inyección SQL
Existen muchas maneras de realizar un ataque con una inyección SQL pero en este artículo te traemos la vía más sencilla de realizarlo. No por ser más sencilla, significa que perjudique menos. Os pongo en situación, tenemos en nuestra web el típico formulario de login en el que solicitamos un email y una contraseña para validar al usuario y que tenga acceso a nuevas funciones en la web.
Si deseo realizar una inyección de código SQL podría rellenar el primer campo con un email, por ejemplo, [email protected] y en el segundo campo, el de la contraseña, lo completaría con este valor: ' or 1=1 --
Al comprobar con una query SQL si ese usuario existe, obtendríamos esto:
SELECT * FROM usuarios WHERE email = '[email protected]' and password = '' or 1=1 --
En la anterior query os indico en negrita la inyección SQL que acabamos de procesar. Esta inyección desactivaría la sentencia agregando un operador lógico OR más una comparación de igualdad que es cierta 1=1. Esta comparación inhabilitaria el resto de la query a la izquierda y proporcionaría una operación lógica verdadera que, como resultado, nos traería los valores de la base de datos, dando acceso final a la aplicación.
Fijaos que el ejemplo ha sido simple pero devastador. Existen inyecciones SQL más complejas, pero con los consejos que te damos a continuación podrás noquearlas de una manera sencilla.
¿Cómo protegerse ante una inyección SQL?
Hay tres acciones básicas que te permitirán evadir estos ataques.
Limpia las peticiones de caracteres especiales
Como habéis visto antes, la inyección ha anulado la consulta del campo contraseña agregándole una comilla simple, aunque también podría haber utilizado una comilla doble. Hay varias maneras de escapar de estos caracteres especiales, por ejemplo, en PHP tenemos la función mysql_real_scape_string() que habilita que este tipo de caracteres no interfieran en la finalidad de la query en sí.
Delimita los valores en las consultas
Usa comillas simples para delimitar cada valor dentro de una consulta. Esto que parece de cajón, a muchos desarrolladores se les olvida. No es lo mismo, esto...
SELECT * FROM usuarios WHERE id = $var
...que esto...
SELECT * FROM usuarios WHERE id = '$var'
Esto combinado con el consejo anterior, se lo pondrá muy difícil a los hackers que van con jeringa en mano.
Verifica siempre los datos enviados
Comprueba que no haya caracteres extraños. Si el campo es un email, comprueba que lo enviado tenga el mismo formato que un email. Si es un número de teléfono, comprueba su longitud y su formato también. Si lo que tiene que introducir el usuario es un número entero, valida que esto sea así. Es decir, verifica que los datos recibidos sean del tipo correcto y te ahorrarás muchos disgustos.
Con lo explicado en este artículo podrás hacer frente a las vulnerabilidades de los proyectos web que desarrolles a futuro frente a las inyecciones SQL. Esperamos que te haya servido de ayuda. ¿Has tenido alguna vez algún problema con una inyección SQL? ¿Sabías que podían ser tan letales?