¿Cómo prevenir un ataque de inyección de SQL en mi aplicación web?

En este artículo aprenderás:

  1. ¿Qué es la inyección de SQL?
  2. Un Ejemplo
  3. ¿Cómo prevenirla desde el front-end?
  4. ¿Cómo prevenirla desde el back-end?

¿Qué es la inyección de SQL?

La inyección SQL es una técnica utilizada por los atacantes para introducir código malicioso en una consulta SQL. Esto puede permitirle a un atacante acceder a información confidencial almacenada o realizar acciones no autorizadas en la base de datos.

Por ejemplo, un atacante podría hacer una inyección SQL transformando una consulta de tal forma que devuelva información que no debería (p.ej. contraseñas o datos de tarjetas de crédito). También podría utilizar la inyección SQL para modificar o eliminar datos de la base de datos.

Un Ejemplo

Un ejemplo común de inyección SQL es cuando un atacante introduce un texto malicioso en un campo de entrada (input) de una aplicación web que es utilizado para construir una consulta SQL. Por ejemplo, imagina que tu aplicación web permite a los usuarios iniciar sesión con su nombre de usuario y contraseña. La aplicación construye una consulta SQL como esta para verificar si el nombre de usuario y la contraseña son válidos:

SELECT * FROM users WHERE username='$username' AND password='$password'

Si un atacante introduce el siguiente valor en el campo de nombre de usuario:

' OR 1=1 --

Nota: El -- al final de la consulta indica el principio de un comentario en SQL, por lo que el resto de la consulta no se ejecutará.

La consulta SQL se convertiría en:

SELECT * FROM users WHERE username='' OR 1=1 --' AND password='$password'

Esto haría que la consulta siempre devuelva verdadero ya que la cláusula WHERE está evaluando si el usuario es igual a '' o si 1=1. Como 1 siempre es igual a 1, la consulta siempre devolverá verdadero y el atacante tendría acceso a todos los registros de usuarios.

¿Cómo prevenirla desde el front-end (React y Vue)?

En una aplicación web siempre debemos de asumir que el input del usuario es malicioso. Bajo ese supuesto, debemos de verificar todos los campos en los cuales el usuario puede escribir. Para prevenir la inyección SQL desde el front-end, debemos asegurarnos de que el valor del input del usuario no contenga caracteres especiales que puedan ser utilizados para inyectar código SQL.

Nota: Este es un ejemplo muy simple de cómo hacer una validación. Para validar inputs más complejos puedes utilizar librerías como validator.js.

¿Cómo prevenirla desde el back-end?

Nota: Los procedimientos almacenados son solamente una de las muchas maneras de prevenir la inyección SQL.

Los procedimientos almacenados de SQL pueden ser una forma útil de proteger su aplicación contra la inyección SQL. Un procedimiento almacenado no es nada más que una consulta SQL parametrizada. La ventaja que tiene sobre una consulta común y corriente es que los datos (parametros) que se le pasan a un procedimiento almacenado no son interpretados como lenguaje SQL. De esta manera, si un atacante intenta inyectar código SQL en un procedimiento almacenado, el código no se ejecutará y solamente se interpretará como texto (y probablemente provoque un error).

  1. Crea un procedimiento almacenado
CREATE PROCEDURE getUser(IN username VARCHAR(255), IN password VARCHAR(255))
BEGIN
  SELECT * FROM users WHERE username=username AND password=password;
END;
  1. Declara tus parámetros y llama a tu procedimiento desde cualquier lugar en tu back-end
SET @username = 'user'; -- Sustituye el valor por el input del usuario
SET @password = 'password'; -- Sustituye el valor por el input del usuario
CALL getUser(@username, @password);

Ayúdame a mejorar este artículo

¿Quisieras complementar este artículo o encontraste algún error?¡Excelente! Envíame un correo.

  • seb@sebastianfdz.com