Checklist de segurança para ERP: vulnerabilidades e correções

Checklist de segurança para ERP: vulnerabilidades e correções
Data: 26/05/2026
---
Introdução
Os sistemas ERP são o coração das operações empresariais: armazenam dados financeiros, informações de clientes, processos de produção e muito mais. Um ponto fraco na segurança desses sistemas pode comprometer toda a organização, gerando perdas financeiras, danos à reputação e multas regulatórias.
Este artigo apresenta um checklist de segurança focado no desenvolvimento de ERP, detalhando as vulnerabilidades mais recorrentes e fornecendo exemplos de código que podem ser copiados e adaptados imediatamente. Cada item do checklist inclui:
A ideia é transformar a teoria em ação concreta, permitindo que equipes de desenvolvimento, QA e DevSecOps trabalhem de forma coordenada.
---
1. Validação de entrada – evitando injeções e scripts maliciosos
| Vulnerabilidade | Impacto | Como detectar |
|---|---|---|
| SQL Injection | Roubo ou alteração de dados críticos. | Testes com payloads como ' OR '1'='1 nas query strings. |
| Cross‑Site Scripting (XSS) | Execução de código JavaScript no navegador do usuário. | Ferramentas como OWASP ZAP ou manualmente inserindo . |
Checklist
- [ ] Sanitizar todos os parâmetros antes de enviá‑los ao banco.
- [ ] Usar consultas parametrizadas ou ORMs que abstraem a construção de SQL.
- [ ] Escapar saída HTML em todas as páginas que exibem dados do usuário.
- [ ] Aplicar CSP (Content Security Policy) para limitar fontes de script.
Exemplo em Java (Spring Boot) – consultas parametrizadas
// Evita SQL Injection usando PreparedStatement
String sql = "SELECT * FROM pedidos WHERE cliente_id = ?";
try (Connection conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setInt(1, clienteId);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
// processa resultado
}
}
Exemplo em Node.js (Express) – escaping de HTML
const escapeHtml = require('escape-html');
app.post('/comentario', (req, res) => {
const texto = escapeHtml(req.body.texto); // impede XSS
salvarComentario(texto);
res.send('Comentário registrado');
});
Exemplo em Python (FastAPI) – validação de tipos com Pydantic
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel, conint
app = FastAPI()
class Pedido(BaseModel):
cliente_id: conint(gt=0) # garante número inteiro positivo
valor: float
@app.post("/pedido")
def criar(pedido: Pedido):
# ORM já gera consultas seguras
db.save(pedido.dict())
return {"msg": "Pedido criado"}
---
2. Controle de acesso – autenticidade e integridade das sessões
| Vulnerabilidade | Impacto | Como detectar |
|---|---|---|
| Broken Authentication | Usuário não autorizado pode assumir contas ou executar ações privilegiadas. | Testes de força‑bruta em endpoints de login, análise de tokens. |
| Cross‑Site Request Forgery (CSRF) | Ações indesejadas executadas em nome do usuário autenticado. | Verificar ausência de tokens anti‑CSRF em formulários POST. |
Checklist
- [ ] Exigir senhas fortes e aplicar hashing com algoritmo adaptativo (bcrypt, Argon2).
- [ ] Implementar MFA (autenticação multifator) para usuários críticos.
- [ ] Usar tokens JWT assinados com chave secreta forte e expiração curta.
- [ ] Adicionar cabeçalhos SameSite nos cookies de sessão.
- [ ] Incluir token CSRF em todos os formulários que alteram estado.
Exemplo em Java (Spring Security) – senha com BCrypt
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(12);
String hash = encoder.encode(senhaBruta);
// salvar hash no banco
Exemplo em Node.js (Express) – middleware CSRF com csurf
const csrf = require('csurf');
const cookieParser = require('cookie-parser');
app.use(cookieParser());
app.use(csrf({ cookie: true }));
app.get('/formulario', (req, res) => {
// token inserido no template
res.render('form', { csrfToken: req.csrfToken() });
});
app.post('/processa', (req, res) => {
// csurf valida automaticamente
res.send('Processado com segurança');
});
Exemplo em Python (FastAPI) – JWT com tempo de expiração
from datetime import datetime, timedelta
import jwt
SECRET = "s3cr3t_k3y_!@#"
ALGORITMO = "HS256"
def gerar_token(usuario_id: int):
payload = {
"sub": usuario_id,
"exp": datetime.utcnow() + timedelta(minutes=30)
}
return jwt.encode(payload, SECRET, algorithm=ALGORITMO)
---
3. Configurações e gerenciamento de segredos
| Vulnerabilidade | Impacto | Como detectar |
|---|---|---|
| Credenciais hardcoded | Código-fonte expõe chaves de API, senhas ou tokens. | Busca em repositórios por padrões como password= ou api_key. |
| Insecure Deserialization | Dados manipulados podem ser transformados em objetos maliciosos. | Testes enviando payloads binários ou JSON alterados. |
Checklist
- [ ] Remover todas as credenciais do código e armazená‑las em cofres de segredos (AWS Secrets Manager, HashiCorp Vault).
- [ ] Configurar variáveis de ambiente e garantir que não sejam logadas.
- [ ] Desabilitar serialização automática de objetos não confiáveis.
- [ ] Validar schemas de entrada antes de desserializar.
- [ ] Aplicar políticas de permissão mínima nos recursos de nuvem.
Exemplo em Java – carregando segredo via variável de ambiente
String dbPassword = System.getenv("DB_PASSWORD");
if (dbPassword == null) {
throw new IllegalStateException("Variável DB_PASSWORD não configurada");
}
DataSource ds = DataSourceBuilder.create()
.url(System.getenv("DB_URL"))
.username(System.getenv("DB_USER"))
.password(dbPassword)
.build();
Exemplo em Node.js – uso de dotenv apenas em desenvolvimento
if (process.env.NODE_ENV !== 'production') {
require('dotenv').config(); // carrega .env local
}
// Sempre use process.env para acessar segredos
const apiKey = process.env.PAYMENT_API_KEY;
if (!apiKey) {
throw new Error('API key não definida');
}
Exemplo em Python – validação de JSON antes da desserialização
from jsonschema import validate, ValidationError
pedido_schema = {
"type": "object",
"properties": {
"cliente_id": {"type": "integer"},
"valor": {"type": "number"},
},
"required": ["cliente_id", "valor"]
}
def processar(payload: dict):
try:
validate(instance=payload, schema=pedido_schema)
except ValidationError as e:
raise ValueError(f"Payload inválido: {e.message}")
# prossegue com lógica segura
---
4. Monitoramento, auditoria e resposta a incidentes
Mesmo com todas as proteções, é essencial detectar rapidamente comportamentos anômalos.
Checklist
- [ ] Centralizar logs de aplicação, banco e firewall em um sistema de agregação (ELK, Graylog).
- [ ] Registrar tentativas de login falhas e bloqueá‑las após N tentativas.
- [ ] Habilitar alertas para alterações de privilégios ou exportação massiva de dados.
- [ ] Manter um plano de resposta que inclua isolamento, análise forense e comunicação.
Exemplo de configuração de log em Python (structlog)
```python import structlog import logging
logging.basicConfig(level=logging.INFO, format="%(message)s") structlog.configure( processors=[ structlog.processors.TimeStamper(fmt="iso"), structlog.processors.JSONRenderer() ], logger_factory=structlog.stdlib.LoggerFactory(), )
log = structlog.get_logger()
def login(usuario, senha): # lógica de autenticação … if


