Diccionario

Inyección SQL

Un ataque en el que se cuela código SQL a través de un formulario o una dirección para leer, cambiar o borrar datos de la base de datos.

Ocurre cuando un programa construye una consulta pegando directamente el texto que escribe el usuario. Un atacante puede escribir algo como ' OR '1'='1 para cambiar el sentido de la consulta.

La defensa es usar siempre consultas parametrizadas o preparadas: los valores viajan aparte y la base de datos nunca los interpreta como código. OWASP la incluye entre los fallos de seguridad más graves.

Un ejemplo

Un buscador vulnerable podría devolver todos los usuarios de la web si alguien escribe un fragmento de SQL en lugar de un nombre.

Por qué importa

La inyección SQL es una de las vulnerabilidades web más antiguas y todavía frecuentes. Ocurre cuando un programa construye una consulta pegando texto que ha escrito el usuario. Si alguien introduce en un campo de login algo como ' OR '1'='1, puede alterar la lógica de la consulta, entrar sin contraseña, leer datos ajenos o incluso borrar tablas.

Importa a cualquiera que escriba código que hable con una base de datos, aunque sea un proyecto personal. La defensa está bien establecida y es sencilla: usar consultas parametrizadas (también llamadas sentencias preparadas), donde la consulta y los datos viajan separados y el gestor nunca interpreta los datos como código. Casi todos los lenguajes y librerías las ofrecen, y los ORM las aplican por defecto.

Confusiones frecuentes

Se cree a veces que basta con «limpiar» las comillas del texto del usuario. Es frágil y propenso a fallos; la solución correcta es parametrizar, no filtrar. También se piensa que solo afecta a formularios de login, cuando cualquier dato que llegue de fuera (parámetros de URL, cabeceras, cookies, campos de búsqueda) puede ser vector. Y usar un ORM no protege automáticamente si luego construyes fragmentos de consulta a mano concatenando texto. Un error típico de principiante es montar consultas con concatenación de cadenas o con formato de texto del propio lenguaje.

Preguntas frecuentes

¿Cómo evito la inyección SQL?

Usando consultas parametrizadas: en lugar de pegar el valor en el texto, pones un marcador (? o $1) y pasas el valor aparte. Nunca concatenes entrada del usuario en la consulta.

¿Validar la entrada es suficiente?

Validar ayuda, pero no sustituye a parametrizar. Es una defensa complementaria: la parametrización es la que impide de raíz que los datos se interpreten como código.