
Artículo · Administración de Servidores
Evitar SQL-Injection en Sistemas Cloud
Este artículo va enfocado al desarrollo seguro, Los ejemplos están escritos en el lenguaje Golang y pueden ser extrapolados a distintos lenguajes de programación.
En mi experiencia desarrollando software para la nube, me he dado cuenta de la gran necesidad que existe de desarrollar sistemas seguros, de minimizar las vulnerabilidades que pueden comprometer las capas del software más importantes, como lo es la Base de Datos.
A continuación se mencionan una serie de buenas prácticas para evitar el SQL-Injection al momento del desarrollo:
Clasifica los Datos
Se debe tener claro qué tipo de información puede o no ser compartida, modificada o añadida a nuestro sistema. Una vez clasificando la información de la manera más simple posible, podemos determinar los permisos y la interacción de los datos que se almacenan y se exponen.
Divide el Sistema en Capas
Evitemos a toda costa el código espagueti, ya que un sistema mal diseñado e implementado es la principal causa de vulnerabilidades, fallos y falta de escalabilidad. Existen paradigmas de Clean Architecture que orientan al equipo de desarrollo de software a optimizar y securizar la interacción de todas las capas y los elementos previamente abstraídos.

Valida Datos de Entrada
Ya que tenemos nuestro sistema segmentado por bloques o capas una de las primeras capas debe ser la de validación de datos de entrada. Esta capa debe verificar el tamaño, eliminar espacios que no son necesarios, en la medida de lo posible usar expresiones regulares que ayudarán a verificar el contenido ingresado. Existen librerías en cada lenguaje para hacer esta validación, pero es muy recomendable tener esta capa de validación con código propio para su mayor control.
Utiliza Variables Escapadas
Al momento de hacer la inserción de información en la base de datos de datos es necesario usar el sistema de escapado que tienen las librerías nativas o librerías oficiales que vinculan la conexión a la base de datos con el lenguaje. Existen también ORM que facilitan este escapado de variables. En el caso de no emplear un ORM es necesario escapar las variables y cuidar los concatenados de las consultas SQL.
Búsquedas Comunes
Ejemplo de un error Grave
query := `SELECT username, dirección, tipo FROM usuarios WHERE username = “` + variableUsername + `” AND enable = 1`
rows, err := dbUsuarios.Read.Query(query)
defer rows.Close()
if err != nil {
return err
}
Ejemplo Correcto
query := `SELECT username, dirección, tipo FROM usuarios WHERE username = ? AND enable = 1`
rows, err := dbUsuarios.Read.Query(query, variableUsername)
defer rows.Close()
if err != nil {
return err
}
Búsquedas Inexactas
Ejemplo de un error Grave
query := `SELECT username, dirección, tipo FROM usuarios WHERE name LIKE “%` + varLikeName + `%” AND enable = 1`
rows, err := dbUsuarios.Read.Query(query)
defer rows.Close()
if err != nil {
return err
}
Ejemplo Correcto
Unicamente es necesario emplear el sistema de escape e inserción de go-mysql y la palabra reservada de mysql CONCAT para tener una consulta a prueba de SQL-Injection.
query := `SELECT username, dirección, tipo FROM usuarios WHERE name LIKE CONCAT('%', ? , '%') AND enable = 1`
rows, err := dbUsuarios.Read.Query(query, varLikeName)
defer rows.Close()
if err != nil {
return err
}
Happy Hacking
¿Quieres aprender estas técnicas en profundidad?
Continúa tu ruta con Penetration Testing Professional.



.jpg)
