O Go-Data utiliza Prepared Statements em todas as queries SQL, usando sql.Named para parametriz
ação segura.
// ✅ SEGURO - Usa prepared statements
namedArgs := NewNamedArgs(dialect)
placeholder := namedArgs.AddArg(userInput)
query := fmt.Sprintf("SELECT * FROM users WHERE name = %s", placeholder)// ❌ VULNERÁVEL - Concatenação direta
query := "SELECT * FROM users WHERE name = '" + userInput + "'"Todos os inputs OData passam por validação antes do parsing:
- $filter: Valida tamanho máximo e detecta padrões de SQL injection
- $search: Valida tamanho e caracteres permitidos
- $select: Valida nomes de propriedades
- $orderby: Valida propriedades e direções (asc/desc)
- $top: Limita valor máximo (padrão: 1000)
- $skip: Limita valor máximo (padrão: 100000)
- $expand: Limita profundidade (padrão: 5 níveis)
config := &odata.ValidationConfig{
MaxFilterLength: 5000, // 5KB
MaxSearchLength: 1000, // 1KB
MaxTopValue: 1000, // máximo 1000 registros
MaxExpandDepth: 5, // máximo 5 níveis
AllowedPropertyChars: `^[a-zA-Z0-9_\.]+$`,
EnableXSSProtection: true,
}SQL Injection:
UNION,SELECT,INSERT,UPDATE,DELETE,DROP- Comentários SQL:
--,#,/*,*/ OR 1=1,AND 1=1OR 'x'='x'
XSS:
<script>,<iframe>,<object>,<embed>javascript:- Event handlers:
onclick=,onload=, etc
Headers de segurança são automaticamente adicionados a todas as respostas:
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Content-Security-Policy: default-src 'self'; ...
Strict-Transport-Security: max-age=31536000; includeSubDomains
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: camera=(), microphone=(), ...Padrão (Balanceada):
config := odata.DefaultSecurityHeadersConfig()Estrita (Máxima Segurança):
config := odata.StrictSecurityHeadersConfig()Relaxada (Desenvolvimento):
config := odata.RelaxedSecurityHeadersConfig()Desabilitar:
config := odata.DisableSecurityHeaders()Rate limiting está habilitado por padrão para proteção contra DDoS e abuso.
config := &odata.RateLimitConfig{
Enabled: true, // ⚠️ HABILITADO POR PADRÃO
RequestsPerMinute: 100,
BurstSize: 20,
WindowSize: time.Minute,
}server := odata.NewServer()
server.GetConfig().RateLimitConfig.Enabled = falseRegistra todas operações críticas:
- CREATE, UPDATE, DELETE (operações de escrita)
- AUTH_SUCCESS, AUTH_FAILURE, AUTH_LOGOUT
- UNAUTHORIZED (tentativas de acesso não autorizado)
config := &odata.AuditLogConfig{
Enabled: true,
LogType: "file", // "file", "stdout", "stderr"
FilePath: "audit.log",
Format: "json", // "json" ou "text"
IncludeSensitiveData: false, // ⚠️ Não habilite em produção
}{
"timestamp": "2025-10-17T10:30:45Z",
"user_id": "123",
"username": "john.doe",
"ip": "192.168.1.100",
"method": "POST",
"path": "/odata/Users",
"entity_name": "Users",
"operation": "CREATE",
"entity_id": "456",
"success": true,
"duration_ms": 45,
"user_agent": "Mozilla/5.0...",
"request_id": "abc-123"
}- Usa algoritmo HS256 por padrão
- Tokens assinados com secret key
- Expiração configurável
- Refresh tokens para renovação segura
- Use secrets fortes (mínimo 32 caracteres)
- Armazene secrets em variáveis de ambiente
- Rotacione secrets regularmente
- Use HTTPS em produção
jwtAuth := odata.NewJwtAuth(&odata.JWTConfig{
SecretKey: os.Getenv("JWT_SECRET"), // ✅ De variável de ambiente
ExpiresIn: 1 * time.Hour,
})- Credenciais em Base64
- EXIGE HTTPS em produção
- Use bcrypt para senhas
// ❌ NÃO use senha plain text
password := "senha123"
// ✅ Use bcrypt
hashedPassword, _ := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)OBRIGATÓRIO em produção!
server := odata.NewServer(&odata.Config{
TLS: &odata.TLSConfig{
Enabled: true,
CertFile: "/path/to/cert.pem",
KeyFile: "/path/to/key.pem",
},
})Configure CORS apropriadamente:
// ❌ Não use em produção
AllowedOrigins: []string{"*"}
// ✅ Especifique domínios permitidos
AllowedOrigins: []string{
"https://app.example.com",
"https://admin.example.com",
}- HTTPS/TLS habilitado
- JWT secrets fortes e em variáveis de ambiente
- Rate limiting habilitado e configurado
- Audit logging habilitado
- Security headers habilitados
- CORS configurado com origens específicas
- Input validation habilitada
- Senhas usando bcrypt (nunca plain text)
- Backup regular de audit logs
- Monitoramento de tentativas de autenticação falhadas
- Monitoramento de rate limit violations
- Firewall configurado
- Banco de dados com autenticação forte
- Princípio de menor privilégio em permissões de BD
Se você descobrir uma vulnerabilidade de segurança, por favor NÃO abra uma issue pública.
Envie um email para: security@example.com (substitua pelo email real)
Incluindo:
- Descrição da vulnerabilidade
- Passos para reproduzir
- Impacto potencial
- Sugestões de correção (se houver)
Mantenha o Go-Data atualizado. Verificamos e atualizamos dependências regularmente.
go get -u github.com/fitlcarlos/go-dataEste documento está licenciado sob a mesma licença do Go-Data.