Remarque rapide: il ne s’agit pas d’une copie de la protection CSRF avec en-têtes personnalisés (et sans jeton de validation) malgré certains chevauchements. Cet article explique comment effectuer la protection CSRF sur les points de terminaison Rest sans discuter si cela est réellement nécessaire. En effet, de nombreuses questions CSRF / Rest que j'ai lues sur ce site parlent de la sécurisation des points de terminaison via des jetons CSRF sans vraiment discuter de la nécessité ou non. D'où cette question.
La protection CSRF est-elle nécessaire pour les points de terminaison de l'API Rest?
J'ai vu beaucoup de discussions sur la sécurisation des points de terminaison REST contre les attaques CSRF, mais Après avoir longuement réfléchi au sujet, je suis convaincu que les jetons CSRF sur un point de terminaison REST n'accordent aucune protection supplémentaire. En tant que tel, l'activation de la protection CSRF sur un point de terminaison REST introduit simplement du code inutile dans votre application, et je pense qu'il devrait être ignoré. Il me manque peut-être quelque chose, d’où cette question. Je pense que cela aidera à garder à l'esprit pourquoi la protection CSRF est nécessaire en premier lieu, et les vecteurs d'attaque contre lesquels elle protège:
Pourquoi CSRF?
Cela se résume vraiment à la capacité des navigateurs à présenter automatiquement les identifiants de connexion pour toute demande en envoyant des cookies. Si un identifiant de session est stocké dans un cookie, le navigateur l'enverra automatiquement avec toutes les demandes qui retournent au site Web d'origine. Cela signifie qu'un attaquant n'a pas réellement besoin de connaître les détails d'authentification pour entreprendre une action en tant qu'utilisateur victime. Au contraire, l'attaquant doit simplement tromper le navigateur de la victime pour qu'il fasse une demande, et les informations d'identification pour authentifier la demande circuleront gratuitement.
Entrez une API REST
Les points de terminaison de l'API Rest présentent une différence très importante par rapport aux autres requêtes: ils sont spécifiquement sans état et ne doivent jamais accepter / utiliser les données d'un cookie ou d'une session. En conséquence, une API REST conforme à la norme est automatiquement immunisée contre une telle attaque. Même si un cookie était envoyé par le navigateur, toutes les informations d'identification associées au cookie seraient complètement ignorées. L'authentification des appels à une API REST se fait d'une manière complètement différente. La solution la plus courante consiste à avoir une sorte de clé d'authentification (un jeton OAuth ou autre) qui est envoyée dans l'en-tête quelque part ou éventuellement dans le corps de la requête lui-même.
Puisque l'authentification est spécifique à l'application, et comme le navigateur lui-même ne sait pas ce qu'est le jeton d'authentification, il n'y a aucun moyen pour un navigateur de fournir automatiquement les informations d'authentification même s'il est d'une manière ou d'une autre amené à visiter le point de terminaison de l'API. En conséquence, un point de terminaison REST sans cookie est complètement immunisé contre les attaques CSRF.
Ou est-ce que je manque quelque chose?