Exposição de Dados em APIs: Prevenção e Detecção
A exposição indevida de dados através de APIs representa uma das principais vulnerabilidades em sistemas modernos. APIs mal configuradas ou inadequadamente protegidas podem vazar informações sensíveis, comprometer dados de usuários e violar regulamentações de privacidade como LGPD e GDPR.
Tipos de Exposição de Dados em APIs
1. Exposição Excessiva de Dados (API3:2023 - OWASP)
APIs que retornam mais informações do que o necessário:
- Endpoint retorna objeto completo quando apenas alguns campos são necessários
- Inclusão de campos sensíveis em respostas (senhas hash, tokens internos)
- Metadados do sistema expostos em erros
// [ERRO] Exemplo RUIM - Expondo dados demais
GET /api/users/123
{
"id": 123,
"name": "João Silva",
"email": "joao@example.com",
"password_hash": "$2b$10$...", // [AVISO] Nunca expor
"ssn": "123-45-6789", // [AVISO] Dado sensível
"internal_role_id": 42, // [AVISO] Dado interno
"created_at": "2025-01-01",
"last_login_ip": "192.168.1.1" // [AVISO] Informação sensível
}
// [OK] Exemplo BOM - Apenas dados necessários
GET /api/users/123/profile
{
"id": 123,
"name": "João Silva",
"avatar_url": "https://..."
}
2. Falta de Filtragem de Recursos (Broken Object Level Authorization)
Usuários podem acessar dados de outros usuários alterando IDs:
// [ERRO] Vulnerável a IDOR (Insecure Direct Object Reference)
GET /api/orders/456 // Usuário A pode ver pedidos do Usuário B
// [OK] Protegido - Validar autorização
app.get('/api/orders/:id', async (req, res) => {
const order = await Order.findById(req.params.id);
// Verificar se o pedido pertence ao usuário autenticado
if (order.userId !== req.user.id) {
return res.status(403).json({ error: 'Acesso negado' });
}
res.json(order);
});
3. Exposição de Informações Sensíveis em URLs
- Tokens de autenticação em query strings
- Dados pessoais em paths
- Informações confidenciais em logs de servidor
Estratégias de Prevenção
Implementar Data Transfer Objects (DTOs)
// TypeScript - Definir claramente o que expor
interface UserPublicDTO {
id: number;
name: string;
avatar_url: string;
}
class UserService {
async getPublicProfile(userId: number): Promise<UserPublicDTO> {
const user = await db.users.findUnique({ where: { id: userId } });
// Retornar apenas campos permitidos
return {
id: user.id,
name: user.name,
avatar_url: user.avatar_url
};
}
}
Aplicar Filtros de Serialização
- Usar bibliotecas como class-transformer (TypeScript)
- Decoradores para marcar campos sensíveis (@Exclude)
- Grupos de serialização para diferentes contextos (público vs. admin)
Validação de Autorização
// Middleware de autorização
const checkResourceOwnership = (resourceType) => {
return async (req, res, next) => {
const resource = await db[resourceType].findById(req.params.id);
if (!resource) {
return res.status(404).json({ error: 'Recurso não encontrado' });
}
if (resource.ownerId !== req.user.id && !req.user.isAdmin) {
return res.status(403).json({ error: 'Acesso não autorizado' });
}
req.resource = resource;
next();
};
};
// Uso
app.get('/api/documents/:id',
authenticate,
checkResourceOwnership('documents'),
(req, res) => {
res.json(req.resource);
}
);
Técnicas de Detecção
Análise de Payloads
- Revisar manualmente responses de endpoints críticos
- Usar ferramentas como Burp Suite, OWASP ZAP
- Testes automatizados para verificar campos expostos
Monitoramento e Alertas
- Detectar padrões de acesso anormais (enumeration)
- Alertar sobre acessos negados excessivos
- Monitorar volume de dados trafegados por usuário
Code Review e Static Analysis
- Revisar DTOs e modelos de serialização
- Verificar implementação de autorizações
- Usar ferramentas SAST para identificar exposições
Melhores Práticas
- Adotar princípio de menor privilégio para dados expostos
- Implementar rate limiting para prevenir scraping
- Usar UUIDs ao invés de IDs sequenciais
- Criptografar dados sensíveis em trânsito e repouso
- Implementar versionamento de API para mudanças seguras
- Realizar testes de segurança regularmente
- Documentar claramente quais dados cada endpoint expõe
- Usar GraphQL com cuidado (pode facilitar over-fetching)
Conformidade e Regulamentação
- LGPD/GDPR: Minimização de dados, base legal para processamento
- PCI-DSS: Proteção de dados de cartão de crédito
- HIPAA: Proteção de informações de saúde (EUA)
- SOC 2: Controles de acesso e monitoramento
