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