Exposición de Datos en APIs: Prevención y Detección
La exposición indebida de datos a través de APIs representa una de las principales vulnerabilidades en los sistemas modernos. Las APIs mal configuradas o inadecuadamente protegidas pueden filtrar información sensible, comprometer datos de usuarios y violar regulaciones de privacidad como la LGPD y el GDPR.
Tipos de Exposición de Datos en APIs
1. Exposición Excesiva de Datos (API3:2023 - OWASP)
APIs que devuelven más información de la necesaria:
- El endpoint devuelve el objeto completo cuando solo se necesitan algunos campos
- Inclusión de campos sensibles en las respuestas (hashes de contraseñas, tokens internos)
- Metadatos del sistema expuestos en los errores
// [ERRO] Exemplo RUIM - Expondo dados demais
GET /api/users/123
{
"id": 123,
"name": "João Silva",
"email": "[email protected]",
"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 Filtrado de Recursos (Broken Object Level Authorization)
Los usuarios pueden acceder a datos de otros usuarios cambiando los 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. Exposición de Información Sensible en las URL
- Tokens de autenticación en cadenas de consulta
- Datos personales en las rutas
- Información confidencial en los registros del servidor
Estrategias de Prevención
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 Serialización
- Usar bibliotecas como class-transformer (TypeScript)
- Decoradores para marcar campos sensibles (@Exclude)
- Grupos de serialización para diferentes contextos (público vs. admin)
Validación de Autorización
// 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 Detección
Análisis de Payloads
- Revisar manualmente las respuestas de los endpoints críticos
- Usar herramientas como Burp Suite, OWASP ZAP
- Pruebas automatizadas para verificar los campos expuestos
Monitoreo y Alertas
- Detectar patrones de acceso anómalos (enumeration)
- Alertar sobre accesos denegados excesivos
- Monitorear el volumen de datos transferidos por usuario
Code Review y Análisis Estático
- Revisar los DTOs y los modelos de serialización
- Verificar la implementación de las autorizaciones
- Usar herramientas SAST para identificar exposiciones
Mejores Prácticas
- Adoptar el principio de mínimo privilegio para los datos expuestos
- Implementar rate limiting para prevenir el scraping
- Usar UUIDs en lugar de IDs secuenciales
- Cifrar los datos sensibles en tránsito y en reposo
- Implementar versionado de API para cambios seguros
- Realizar pruebas de seguridad con regularidad
- Documentar claramente qué datos expone cada endpoint
- Usar GraphQL con cuidado (puede facilitar el over-fetching)
Conformidad y Regulación
- LGPD/GDPR: Minimización de datos, base legal para el procesamiento
- PCI-DSS: Protección de datos de tarjetas de crédito
- HIPAA: Protección de información de salud (EE. UU.)
- SOC 2: Controles de acceso y monitoreo
