web-dev-qa-db-fra.com

Les attaques CSRF s'appliquent-elles aux API?

En particulier, j'écris une Django API RESTful pour sauvegarder une application iOS, et je continue à utiliser les protections CSRF de Django chaque fois que j'écris des méthodes pour gérer POST = demandes.

Ma compréhension est que les cookies gérés par iOS ne sont pas partagés par les applications, ce qui signifie que mes cookies de session sont sûrs, et aucune autre application ne peut les utiliser. Est-ce vrai? Si oui, puis-je simplement marquer toutes mes fonctions API comme exemptes de CSRF?

49
Alex

Ce n'est pas le but du CSRF. CSRF est d'empêcher la publication directe de données sur votre site. En d'autres termes, le client doit effectivement publier via un chemin approuvé, c'est-à-dire afficher la page du formulaire, le remplir, soumettre les données.

Une API empêche à peu près CSRF, car son objectif est généralement de autoriser des entités tierces à accéder aux données de votre site et à les manipuler (le "cross-site" dans CSRF). Donc, oui, je pense qu'en règle générale, toute vue API doit être exempte de CSRF. Cependant, vous devriez toujours suivre les meilleures pratiques et protéger chaque point de terminaison API qui apporte réellement une modification avec une certaine forme d'authentification, comme OAuth.

47
Chris Pratt

Les attaques CSRF reposent sur l'envoi de cookies implicitement avec toutes les demandes vers un domaine particulier. Si vos points de terminaison API ne permettent pas l'authentification basée sur les cookies, vous devriez être bon.

Même si vous utilisez l'authentification basée sur les cookies, vos cookies sont sûrs car les applications iOS ne partagent pas les cookies . Cependant, à moins que vous ne bloquiez intentionnellement les navigateurs Web en exigeant un en-tête d'agent utilisateur inhabituel, une autre partie pourrait créer une application basée sur un navigateur qui utilise votre API, et cette application serait vulnérable aux attaques CSRF si votre API prend en charge l'authentification basée sur les cookies et ne le fait pas. 'appliquer la protection CSRF.

45
Nick Retallack

Ils s'appliquent si vous utilisez également votre API pour prendre en charge un site Web.

Dans ce cas, vous avez toujours besoin d'une forme de protection CSRF pour empêcher quelqu'un d'incorporer des demandes dans d'autres sites d'avoir des effets d'entraînement sur le compte d'un utilisateur authentifié.

Chrome semble refuser l'origine croisée POST demandes par défaut (les autres navigateurs peuvent ne pas être aussi stricts), mais autorise les demandes GET entre les origines, vous devez donc vous assurer que toutes les demandes GET dans votre API ne sont pas '' t avoir des effets secondaires.

16
James

Cette réponse actuellement acceptée (mai 2012) est généralement correcte, sauf lorsque vous utilisez l'authentification basée sur la session. Il convient également de mentionner le rôle de CORS.

Le scénario simple est que vous visitez foo.com et le site Web exécute Javascript pour effectuer une demande DELETE basée sur AJAX à api.com/users/123 et finit par supprimer l'utilisateur en votre nom. Maintenant, ce n'est pas toujours possible à cause de CORS - les navigateurs empêcheront foo.com de faire une demande à api.com sauf si api.com explicitement les listes blanches foo.com. Cela suppose également que vous utilisez l'authentification basée sur la session pour vos API par opposition à l'authentification basée sur les jetons. Dans l'authentification basée sur la session, tout utilisateur connecté à api.com peut exécuter des demandes pendant qu'elles restent connectées. Si vous disposez d'une authentification basée sur des jetons (chaque demande doit être conçue avec un en-tête HTTP Authorization contenant le jeton d'authentification), vous êtes en sécurité. L'authentification basée sur la session envoie implicitement le jeton d'authentification via les cookies.

Un scénario légèrement pire est si l'un de vos domaines CORS de confiance devient compromis - disons que vous avez un formulaire qui ne nettoie pas Javascript et qu'un utilisateur parvient à injecter JS sur votre site via ce formulaire. Si vous utilisez l'authentification basée sur la session, un utilisateur authentifié visitant la page verra le Javascript s'exécuter et fera une demande d'API. Cela pourrait être désastreux et une possibilité très réelle si vous utilisez l'authentification basée sur la session pour votre API.

9
aleemb

Selon documentation DRF les API sont vulnérables aux attaques CSRF tant que le serveur utilise une session authentifiée (au lieu de demander à chaque fois un mot de passe)

La solution est

  1. Assurez-vous que les opérations HTTP "sécurisées", telles que GET, HEAD et OPTIONS ne peuvent pas être utilisées pour modifier un état côté serveur.
  2. Assurez-vous que toutes les opérations HTTP "non sécurisées", telles que POST, PUT, PATCH et DELETE, nécessitent toujours un jeton CSRF valide.
2
nehemiah