API et requêtes
Attaques qui exploitent la forme d'une requête ou la confiance qu'un navigateur accorde à votre site. Elles sont faciles à manquer, car le client normal ne les envoie jamais.
Liste de contrôle
- Protégez les requêtes qui modifient l'état contre le CSRF. Si vous authentifiez par cookies, chaque point d'accès qui modifie l'état a besoin d'un jeton CSRF ou d'une politique de cookie SameSite stricte. Si vous authentifiez par un jeton porteur dans un en-tête Authorization (et non par un cookie implicite), le CSRF classique ne s'applique pas, ce qui est l'une des raisons de le préférer.
- Fermez le CSRF de connexion. Même le flux de connexion peut être falsifié : liez le
stateOAuth au navigateur grâce à un cookie posé au départ et vérifié au retour. Voir authentification. - Verrouillez CORS. Ne renvoyez jamais un
Originarbitraire et n'utilisez jamaisAccess-Control-Allow-Origin: *avec des identifiants. Utilisez une liste d'origines explicite, et uniquement les méthodes et en-têtes dont vous avez besoin. Un réglage « tout autoriser » par défaut est une erreur courante des modèles de départ. - Empêchez le mass assignment. N'injectez jamais directement le corps d'une requête dans une mise à jour de base de données. Acceptez une liste d'autorisation explicite des champs modifiables, afin qu'un utilisateur ne puisse pas envoyer
{"role":"admin"}ou{"plan":"enterprise"}pour s'octroyer des privilèges. Marquez les champs en lecture seule et ignorez les champs inconnus. - N'accordez des privilèges et un état payant que depuis un événement de confiance. Un plan ou un solde de crédits ne doit changer qu'à partir d'un webhook de paiement vérifié ou d'une action d'administrateur, jamais à partir d'une valeur contenue dans une requête utilisateur.
- Vérifiez les webhooks. Contrôlez la signature du fournisseur sur le corps brut, confirmez que le montant et la devise correspondent à ce que vous attendiez, et rendez chaque événement idempotent pour qu'un rejeu ne puisse pas l'appliquer deux fois.
- Validez les types de contenu et les tailles. Rejetez les types de contenu inattendus et plafonnez la taille du corps avant de l'analyser.
Comment tester
- Ajoutez
role,is_admin,planoucreditsà une requête de mise à jour et vérifiez que le serveur les ignore. - Envoyez une requête cross-origin et vérifiez que CORS ne renvoie pas votre origine.
- Rejouez un webhook deux fois et vérifiez qu'il n'est appliqué qu'une fois.