Authentifier un webhook ne signifie pas le valider
De nombreux développeurs déploient un bug dangereux en production. Ils confondent l'authentification et la validation.
L'authentification signifie que le message provient du bon fournisseur. La validation signifie que les données contenues dans le message sont correctes.
Si vous ne réalisez que la première étape, vous perdez de l'argent.
Une vulnérabilité WordPress récente (CVE-2026-9189) illustre cette erreur. L'extension Contact Form 7 PayPal and Stripe Add-on n'a pas vérifié les montants des paiements.
Voici comment un attaquant exploite cela :
- Un attaquant crée une commande de 2 000 $.
- L'attaquant effectue un véritable paiement de 1 $.
- Il configure le numéro de facture pour qu'il corresponde à la commande de 2 000 $.
- PayPal envoie une notification réelle et vérifiée pour le paiement de 1 $.
- L'extension voit le message vérifié et marque la commande de 2 000 $ comme payée.
L'extension a fait confiance au messager, mais a ignoré le message.
Ne commettez pas cette erreur. Lorsque vous gérez des webhooks, suivez ces étapes :
- Authentifiez le message à l'aide de signatures ou de secrets partagés.
- Faites correspondre le montant et la devise avec la commande dans votre base de données.
- Vérifiez que l'e-mail du destinataire correspond à votre compte.
- Utilisez une valeur côté serveur pour lier la commande. Ne vous fiez pas uniquement à un ID de facture envoyé dans la charge utile (payload).
- Utilisez l'idempotence pour ignorer les ID de transaction en double.
- Maintenez la vérification TLS active pour toutes les requêtes.
- Appliquez le principe du « fail closed » (échec par défaut). Si un contrôle échoue, arrêtez tout.
Si vous utilisez la version 2.4.9 ou antérieure de l'extension Contact Form 7 PayPal and Stripe Add-on, mettez-la à jour dès maintenant. Chaque commande impayée est une cible pour cet exploit.
Authentifiez toujours le messager, puis vérifiez les données.