Qu'est-ce que le Top 10 de l'OWASP en matière de sécurité des API ?

Classement des risques de sécurité spécifiques aux API publié par l'OWASP (Open Worldwide Application Security Project). L'édition 2023 fournit la dernière liste reflétant les menaces qui ont augmenté avec l'adoption généralisée des API.

1️⃣ API1:2023 - Autorisation de niveau objet brisée (BOLA)

Critical

Vue d'ensemble

Une vulnérabilité qui permet un accès non autorisé aux données d'autres utilisateurs en manipulant les identifiants d'objets. Il s'agit de la vulnérabilité la plus fréquente et la plus facile à exploiter.

Risque

Les attaquants peuvent accéder aux informations personnelles d'autres utilisateurs, aux détails de paiement, à l'historique des commandes et à bien d'autres choses encore, simplement en modifiant l'identifiant dans l'URL ou les paramètres de la requête.

Exemple de code vulnérable

JavaScript (Express) ❌ Bad
// Reçoit l'identifiant et renvoie les données directement - pas de contrôle d'autorisation
app.get('/api/users/:id/orders', async (req, res) => {
  const orders = await Order.find({ userId: req.params.id });
  res.json(orders);
});

Exemple de code sécurisé

JavaScript (Express) ✅ Good
// Vérifier l'identité de l'utilisateur authentifié pour le contrôle de l'autorisation
app.get('/api/users/:id/orders', authenticate, async (req, res) => {
  if (req.user.id !== req.params.id && !req.user.isAdmin) {
    return res.status(403).json({ error: 'Forbidden' });
  }
  const orders = await Order.find({ userId: req.params.id });
  res.json(orders);
});

Liste de contrôle des mesures d'atténuation

2️⃣ API2:2023 - Authentification brisée

Critical

Vue d'ensemble

Une vulnérabilité qui permet à des attaquants de prendre le contrôle de comptes d'utilisateurs légitimes en raison d'implémentations défectueuses du mécanisme d'authentification.

Problèmes communs

Politiques de mot de passe insuffisantes, mauvaise gestion des jetons, absence de protection par force brute, gestion inadéquate des sessions, etc.

JavaScript Exemple d'atténuation : Vérification des JWT
const jwt = require('jsonwebtoken');

function authenticate(req, res, next) {
  const token = req.headers.authorization?.split(' ')[1];
  if (!token) return res.status(401).json({ error: 'Token required' });

  try {
    // Spécifier explicitement l'algorithme (empêche l'attaque alg : none)
    const decoded = jwt.verify(token, process.env.JWT_SECRET, {
      algorithms: ['HS256'],
      issuer: 'your-app',
    });
    req.user = decoded;
    next();
  } catch (err) {
    res.status(401).json({ error: 'Invalid token' });
  }
}

3️⃣ API3:2023 - Autorisation de niveau de propriété d'objet rompue

High

Vue d'ensemble

Une vulnérabilité où le contrôle d'accès sur les propriétés (champs) des objets inclus dans les réponses de l'API est insuffisant. Cet élément combine l'exposition excessive aux données et l'assignation en masse.

JavaScript ✅ Filtrage des réponses
// Retourne uniquement les champs publics de l'objet utilisateur
function sanitizeUser(user, requesterId) {
  const publicFields = { id: user.id, name: user.name, avatar: user.avatar };

  // Seul le propriétaire peut voir les champs supplémentaires
  if (requesterId === user.id) {
    publicFields.email = user.email;
    publicFields.phone = user.phone;
  }

  return publicFields;
  // ❌ retourner l'utilisateur ; fuite du password_hash, etc.
}

4️⃣ API4:2023 - Consommation de ressources sans restriction

High

Vue d'ensemble

Une vulnérabilité où il n'y a pas de limites à la taille, à la fréquence ou à la consommation de ressources des requêtes API, ce qui conduit à des attaques DoS ou à des augmentations de coûts.

JavaScript (Express) ✅ Mise en œuvre des limites de ressources
const rateLimit = require('express-rate-limit');

// Limitation globale du débit
app.use(rateLimit({
  windowMs: 15 * 60 * 1000, // 15 minutes
  max: 100,                   // Maximum 100 demandes
  standardHeaders: true,
}));

// Limite de la taille de la charge utile
app.use(express.json({ limit: '10kb' }));

// Limite supérieure de la pagination
app.get('/api/items', (req, res) => {
  const limit = Math.min(parseInt(req.query.limit) || 20, 100);
  // ...
});

5️⃣ API5:2023 - Autorisation de niveau de fonction rompue

High

Vue d'ensemble

Une vulnérabilité dans laquelle un contrôle d'accès approprié n'est pas mis en œuvre pour les fonctions d'administration et les points de terminaison, ce qui permet à des utilisateurs ordinaires d'effectuer des opérations d'administration.

JavaScript Contrôle d'accès basé sur les rôles
function authorize(...roles) {
  return (req, res, next) => {
    if (!roles.includes(req.user.role)) {
      return res.status(403).json({ error: 'Insufficient permissions' });
    }
    next();
  };
}

// Accès réservé aux administrateurs
app.delete('/api/admin/users/:id', authenticate, authorize('admin'), deleteUser);

// Admin et modérateur
app.put('/api/posts/:id/moderate', authenticate, authorize('admin', 'moderator'), moderatePost);

6️⃣ API6:2023 - Accès illimité aux flux commerciaux sensibles

Medium

Vue d'ensemble

Vulnérabilité dans laquelle les flux logiques critiques ne sont pas protégés contre les attaques automatisées. Exemples : vente de billets à la sauvette, récolte massive de coupons, envoi de spam, etc.

Atténuations

7️⃣ API7:2023 - Falsification de requête côté serveur (SSRF)

High

Vue d'ensemble

Une vulnérabilité dans laquelle le serveur récupère une URL fournie par l'utilisateur sans validation, ce qui permet un accès non autorisé aux réseaux internes.

JavaScript ✅ Atténuation du SSRF
const { URL } = require('url');

function isAllowedUrl(input) {
  try {
    const url = new URL(input);
    // Restreindre les protocoles
    if (!['https:', 'http:'].includes(url.protocol)) return false;
    // Bloquer les plages d'adresses IP privées
    const blocked = ['127.0.0.1', 'localhost', '0.0.0.0', '169.254.169.254'];
    if (blocked.includes(url.hostname)) return false;
    // Vérifier les plages de réseaux internes (10.x, 172.16-31.x, 192.168.x)
    if (/^(10\.|172\.(1[6-9]|2\d|3[01])\.|192\.168\.)/.test(url.hostname)) return false;
    return true;
  } catch {
    return false;
  }
}

8️⃣ API8:2023 - Mauvaise configuration de la sécurité

Medium

Vue d'ensemble

Paramètres de sécurité inappropriés sur les serveurs API ou les frameworks. Il s'agit notamment de l'autorisation de méthodes HTTP inutiles, de politiques CORS trop permissives, de l'exposition d'informations de débogage, etc.

JavaScript (Express) ✅ Configuration de l'en-tête de sécurité
const helmet = require('helmet');
const cors = require('cors');

app.use(helmet());
app.use(cors({
  origin: ['https://app.example.com'], // Ne pas utiliser de caractères génériques
  methods: ['GET', 'POST', 'PUT', 'DELETE'],
  credentials: true,
}));

// Gestionnaire d'erreurs : ne pas renvoyer les traces de la pile en production
app.use((err, req, res, next) => {
  res.status(500).json({
    error: process.env.NODE_ENV === 'production'
      ? 'Internal Server Error'
      : err.message,
  });
});

9️⃣ API9:2023 - Gestion incorrecte des stocks

Medium

Vue d'ensemble

État dans lequel d'anciennes versions de points d'extrémité d'API sont exposées sans que des correctifs de sécurité aient été appliqués. Également connu sous le nom d'API fantômes ou d'API zombies.

Atténuations

🔟 API10:2023 - Consommation dangereuse d'IPA

Medium

Vue d'ensemble

Une vulnérabilité dans laquelle les réponses d'API tierces sont acceptées sans validation. Si une API externe est compromise, l'impact se propage à votre propre système.

JavaScript ✅ Validation de la réponse de l'API externe
const Ajv = require('ajv');
const ajv = new Ajv();

// Valider les réponses de l'API externe à l'aide d'un schéma
const externalSchema = {
  type: 'object',
  required: ['id', 'status'],
  properties: {
    id: { type: 'string', maxLength: 50 },
    status: { type: 'string', enum: ['active', 'inactive'] },
  },
  additionalProperties: false,
};

const validate = ajv.compile(externalSchema);

async function fetchExternalData() {
  const res = await fetch('https://api.external.com/data');
  const data = await res.json();

  if (!validate(data)) {
    throw new Error('External API response validation failed');
  }
  return data;
}

📊 Tableau récapitulatif

ID Vulnérabilité Sévérité Principales mesures d'atténuation
API1Broken Object Level AuthorizationCriticalContrôles des autorisations au niveau des objets
API2Broken AuthenticationCriticalGestion adéquate des jetons et protection par force brute
API3Broken Object Property Level AuthorizationHighFiltrage des champs de réponse explicite
API4Unrestricted Resource ConsumptionHighLimitation du débit et de la taille de la charge utile
API5Broken Function Level AuthorizationHighContrôle d'accès basé sur les rôles
API6Unrestricted Access to Sensitive Business FlowsMediumCAPTCHA et limitation des taux au niveau de l'entreprise
API7Server Side Request ForgeryHighValidation des URL et blocage des IP privées
API8Security MisconfigurationMediumEn-têtes de sécurité et configuration CORS
API9Improper Inventory ManagementMediumGestion de l'inventaire des API et politiques d'obsolescence
API10Unsafe Consumption of APIsMediumValidation du schéma des réponses de l'API externe