Exposition de Données dans les API : Prévention et Détection

L'exposition inappropriée de données via les API représente l'une des principales vulnérabilités des systèmes modernes. Des API mal configurées ou insuffisamment protégées peuvent divulguer des informations sensibles, compromettre les données des utilisateurs et enfreindre les réglementations sur la confidentialité telles que la LGPD et le RGPD.

Types d'Exposition de Données dans les API

1. Exposition Excessive de Données (API3:2023 - OWASP)

Des API qui renvoient plus d'informations que nécessaire :

  • Le endpoint renvoie l'objet complet alors que seuls quelques champs sont nécessaires
  • Inclusion de champs sensibles dans les réponses (hachages de mots de passe, tokens internes)
  • Métadonnées système exposées dans les erreurs
      // [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. Absence de Filtrage des Ressources (Broken Object Level Authorization)

Les utilisateurs peuvent accéder aux données d'autres utilisateurs en modifiant les ID :

      // [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. Exposition d'Informations Sensibles dans les URL

  • Tokens d'authentification dans les chaînes de requête
  • Données personnelles dans les chemins
  • Informations confidentielles dans les journaux du serveur

Stratégies de Prévention

Implémenter des Data Transfer Objects (DTO)

      // 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
      };
      }
      }
      

Appliquer des Filtres de Sérialisation

  • Utiliser des bibliothèques telles que class-transformer (TypeScript)
  • Décorateurs pour marquer les champs sensibles (@Exclude)
  • Groupes de sérialisation pour différents contextes (public vs. admin)

Validation de l'Autorisation

      // 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);
      }
      );
      

Techniques de Détection

Analyse des Payloads

  • Examiner manuellement les réponses des endpoints critiques
  • Utiliser des outils tels que Burp Suite, OWASP ZAP
  • Tests automatisés pour vérifier les champs exposés

Surveillance et Alertes

  • Détecter les schémas d'accès anormaux (enumeration)
  • Alerter en cas d'accès refusés excessifs
  • Surveiller le volume de données transférées par utilisateur

Code Review et Analyse Statique

  • Examiner les DTO et les modèles de sérialisation
  • Vérifier l'implémentation des autorisations
  • Utiliser des outils SAST pour identifier les expositions

Meilleures Pratiques

  • Adopter le principe du moindre privilège pour les données exposées
  • Implémenter le rate limiting pour prévenir le scraping
  • Utiliser des UUID au lieu d'ID séquentiels
  • Chiffrer les données sensibles en transit et au repos
  • Implémenter le versionnage de l'API pour des changements sûrs
  • Effectuer régulièrement des tests de sécurité
  • Documenter clairement quelles données chaque endpoint expose
  • Utiliser GraphQL avec précaution (cela peut faciliter l'over-fetching)

Conformité et Réglementation

  • LGPD/RGPD : Minimisation des données, base légale du traitement
  • PCI-DSS : Protection des données de carte de crédit
  • HIPAA : Protection des informations de santé (États-Unis)
  • SOC 2 : Contrôles d'accès et surveillance