Artículo · Administración de Servidores

Evitar SQL-Injection en Sistemas Cloud

Brayhan Alejandro Gabriel GuerreroBrayhan Alejandro Gabriel Guerrero 3 min de lectura

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.

Brayhan Alejandro Gabriel Guerrero

Escrito por

Brayhan Alejandro Gabriel Guerrero

Full-Stack Developer