Una de las clases más importantes de vulnerabilidades web se conoce como "inyección SQL" o SQLi. El lenguaje de consulta estructurado, también conocido como SQL, es el lenguaje utilizado para interactuar con la mayoría de las bases de datos, aunque se utilizan varias variantes del lenguaje según la plataforma de la base de datos. Cualquier sitio web que almacene datos del usuario, como información de la cuenta, o que proporcione la funcionalidad de carga del usuario, como un sitio web de alojamiento de imágenes, utilizará una base de datos para almacenar esos datos.
Sugerencia: SQL generalmente se pronuncia "ess cue ell" o "secuela", siendo la primera opción más común en inglés británico y la segunda más frecuente en inglés americano. Ambas pronunciaciones se entienden generalmente en el contexto de hablar de bases de datos.
¿Qué es SQLi?
SQLi es una vulnerabilidad en la que los desarrolladores web que diseñan el código que se comunica entre el servidor web y la base de datos no implementan protecciones contra los comandos SQL enviados por un usuario. El problema es que es posible escapar de las declaraciones de la base de datos y agregar nuevos argumentos o una declaración completamente nueva. La declaración de la base de datos modificada o segunda puede realizar una variedad de acciones que incluyen eliminaciones o filtraciones de datos potencialmente a gran escala.
Los exploits generalmente giran en torno a hacer que las declaraciones existentes sean verdaderas en todas las circunstancias o proporcionar un segundo comando por lotes que realiza una acción específica, como eliminar o mostrar todos los datos. Por ejemplo, una declaración SQL para iniciar sesión en un sitio web puede verificar si el nombre de usuario y la contraseña enviados coinciden con una entrada en la base de datos. Para intentar obtener acceso, un exploit de inyección SQL puede intentar agregar una cláusula "o verdadero" como "o 1 = 1". Esto haría que el comando sea del tipo "iniciar sesión con [este] nombre de usuario, si la contraseña es [este], o esta afirmación es verdadera".
Cómo prevenir SQLi
SQLi solía ser una forma muy común para que los sitios web tuvieran su base de datos violada y luego filtrada en línea. Debido a un esfuerzo concertado para garantizar que la conciencia de seguridad sea parte de la capacitación de los desarrolladores, esta clase de vulnerabilidad se ha resuelto en gran medida y rara vez se ve.
El método correcto para prevenir SQLi es usar declaraciones preparadas, también conocidas como consultas parametrizadas. Tradicionalmente, las declaraciones SQL se declaran y la entrada del usuario se concatena en ellas durante esa declaración. Con las declaraciones preparadas, el comando de la base de datos se escribe y luego una función especial ejecuta el comando e inserta los datos del usuario. Si bien esto puede parecer una diferencia menor, cambia por completo la forma en que se maneja el comando. La diferencia evita que se ejecuten comandos SQL significativos y trata todas las entradas del usuario como una cadena, evitando que ocurra la inyección SQL.