Protección contra SQL Injection
La protección contra SQL injection es absoluta gracias al uso exclusivo de prepared statements.
Mecanismo de protección
Sección titulada «Mecanismo de protección»// Todas las queries usan PrepareContext()stmt, err := s.db.PrepareContext(ctx, query)defer stmt.Close()rows, err := stmt.QueryContext(ctx, args...)Defensa en capas
Sección titulada «Defensa en capas»- Prepared statements obligatorios — Todas las queries usan
PrepareContext() - Separación de código y datos — Los parámetros se pasan como argumentos separados
- Sin concatenación de strings SQL — El driver go-mssqldb maneja el escaping automáticamente
Ejemplo de ataque bloqueado
Sección titulada «Ejemplo de ataque bloqueado»-- 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'' --'Protecciones adicionales
Sección titulada «Protecciones adicionales»Bloqueo de comandos peligrosos
Sección titulada «Bloqueo de comandos peligrosos»En modo solo lectura, se bloquean:
EXEC/EXECUTESP_/XP_(procedimientos del sistema peligrosos)OPENROWSET/OPENDATASOURCEBULK INSERTRECONFIGURE
Validación de entrada
Sección titulada «Validación de entrada»- 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
Tests de seguridad
Sección titulada «Tests de seguridad»# Ejecutar suite de tests de SQL injectiongo test -v -run TestSQLInjectionVulnerability ./test/security/...Los tests cubren 6 vectores de ataque diferentes, todos bloqueados exitosamente.