La politique de même origine (SOP) oblige les navigateurs à bloquer les scripts d'une origine pour jouer avec une autre, sauf indication explicite de ne pas le faire. Mais les POST intersites sont toujours autorisés, créant le vecteur d'attaques CSRF. La défense est des jetons anti-contrefaçon.
Mais pourquoi les développeurs de navigateurs ne suivent-ils pas simplement la même philosophie de SOP lorsqu'ils traitent avec des POST?
En théorie, votre suggestion est parfaitement raisonnable. Si les navigateurs bloquaient toutes les requêtes Cross Origin POST par défaut, et qu'il fallait une stratégie CORS pour les déverrouiller, beaucoup de toutes les vulnérabilités CSRF là-bas disparaîtraient comme par magie. En tant que développeur, vous ne feriez que besoin de s'assurer de ne pas changer l'état du serveur sur les requêtes GET. Aucun jeton ne serait nécessaire. Ce serait bien.
Mais ce n'est pas ainsi qu'Internet a été construit à l'époque, et il n'y a aucun moyen de le changer maintenant. Il existe de nombreuses utilisations légitimes de Cross Origin POST requêtes. Si les navigateurs changeaient soudainement les règles en cours de partie et l'interdisaient, les sites s'appuyant sur les anciennes règles cesseraient de fonctionner. Briser les sites existants comme ça est quelque chose qui nous essayons d'éviter autant que possible. Malheureusement, nous devons vivre avec notre passé.
Existe-t-il un moyen de modifier le système pour qu'il fonctionne mieux sans rien casser? Une façon serait d'introduire un nouveau verbe HTTP, appelons-le PEST, qui fonctionne exactement comme POST seulement que toutes les demandes PEST sont contrôlées en amont et soumises aux politiques CORS. C'est juste une suggestion idiote que je inventé, mais il montre comment nous pouvons développer les normes sans les briser.
Le problème n'est pas la méthode de demande: CSRF pourrait également être fait avec une demande GET. Le problème est plutôt que les informations d'authentification comme les cookies (de session) ou l'en-tête Authorization
sont automatiquement incluses avec la demande intersite, ce qui rend CSRF possible. Par conséquent, l'atténuation ne consisterait pas à interdire l'utilisation de telles méthodes dans les demandes intersites, mais plutôt à ne pas envoyer ces informations d'authentification.
Avec les cookies, il est proposé un drapeau du même site qui garantirait que le cookie n'est pas envoyé dans les demandes intersites. Malheureusement, le drapeau n'est actuellement disponible que disponible dans Chrome , mais deviendra disponible pour Firefox avec la v60 en mai 2018. En outre, il aurait été préférable que cette restriction soit activée par défaut et devrait être explicitement modifié pour être moins sécurisé (comme dans CORS) au lieu d'être non sécurisé par défaut. Seulement cela signifierait un changement sérieux du comportement actuel et casserait probablement de nombreuses applications existantes.
Je suis en partie en désaccord avec Anders sur
Mais ce n'est pas ainsi qu'Internet a été construit à l'époque, et il n'y a aucun moyen de le changer maintenant.
Les développeurs des principaux navigateurs ont à peu près le pouvoir de changer Internet et de guider les développeurs Web dans la direction qu'ils souhaitent. Obsolète intersite POST seraient possibles si elles étaient considérées comme une menace majeure. Il existe des exemples de tels progrès sur d'autres choses, bien que ce ne soit ni soudain ni rapide:
Éclat. Alors qu'il était auparavant considéré comme l'avenir du Web, les principaux navigateurs ont annoncé ne plus le prendre en charge à l'avenir, et les développeurs Web s'adaptent.
HTTPS a été lentement forcé par les navigateurs, avec de petits pas vers l'avertissement sur le HTTP simple non sécurisé. Nous pourrons éventuellement voir un monde où le HTTP simple est lentement étouffé à mort.
J'aimerais que cela évolue vers une priorité plus large de la sécurité sur la compatibilité. Naturellement, un changement aussi important ne serait pas quelque chose à faire trop près, mais en donnant des alternatives et décourageant d'abord. Le chemin pour y parvenir pourrait être le suivant:
POST
, qui autorise un consentement explicite.POST
sans le consentement.Décourager POST
sur HTTP simple est assez proche de décourager les intersites POST
, les deux étant contraires aux normes. Il s'agit simplement d'une perte consciente de compatibilité descendante, pour augmenter la sécurité.