sql >> Base de Datos >  >> RDS >> Mysql

construyendo una consulta dinámica en mysql y golang

Para responder a su pregunta sobre cómo formatear la cadena, la respuesta simple es usar fmt.Sprintf para estructurar su cadena. Sin embargo vea más abajo para una nota rápida sobre el uso de fmt.Sprintf para consultas de base de datos:

Ejemplo:

query := fmt.Sprintf("SELECT id FROM users WHERE login='%s'", login)
err = db.Query(query)

// Equivalent to:
rows, err := db.Query("SELECT id FROM users WHERE login=?", login)

Al usar esto para consultas, está a salvo de inyecciones. Dicho esto, es posible que tenga la tentación de modificar esto y usar db.Exec para creaciones/actualizaciones/eliminaciones también. Como regla general, si usa db.Exec con fmt.Sprintf y no desinfecta sus entradas primero, se expone a inyecciones de sql .

GoPlay con un ejemplo simple de por qué fmt.Sprintf con db.Exec es malo:
https://play.golang.org/p/-IWyymAg_Q

Debe usar db.Query o db.Prepare de forma adecuada para evitar este tipo de vectores de ataque. Es posible que deba modificar el ejemplo de código anterior para generar un fragmento de código seguro para inyección, pero espero haberle dado lo suficiente para comenzar.