Ir al contenido

Protección contra SQL Injection

La protección contra SQL injection es absoluta gracias al uso exclusivo de prepared statements.

// Todas las queries usan PrepareContext()
stmt, err := s.db.PrepareContext(ctx, query)
defer stmt.Close()
rows, err := stmt.QueryContext(ctx, args...)
  1. Prepared statements obligatorios — Todas las queries usan PrepareContext()
  2. Separación de código y datos — Los parámetros se pasan como argumentos separados
  3. Sin concatenación de strings SQL — El driver go-mssqldb maneja el escaping automáticamente
-- Intento de inyección:
SELECT * FROM users WHERE username = '1' OR '1'='1' --
-- Con prepared statements, se trata como literal:
SELECT * FROM users WHERE username = '1'' OR ''1''=''1'' --'

En modo solo lectura, se bloquean:

  • EXEC / EXECUTE
  • SP_ / XP_ (procedimientos del sistema peligrosos)
  • OPENROWSET / OPENDATASOURCE
  • BULK INSERT
  • RECONFIGURE
  • Límite de tamaño de consulta (1MB por defecto, configurable)
  • Rechazo de entrada vacía
  • Eliminación de comentarios que podrían ocultar comandos
Ventana de terminal
# Ejecutar suite de tests de SQL injection
go test -v -run TestSQLInjectionVulnerability ./test/security/...

Los tests cubren 6 vectores de ataque diferentes, todos bloqueados exitosamente.