web-dev-qa-db-fra.com

GET et POST demande vulnérable aux attaques CSRF?

Les requêtes GET et POST sont-elles vulnérables à CSRF? Devrions-nous utiliser PUT à la place?

9
Ngoc Huynh

Oui, GET et POST sont vulnérables à CSRF.

Cependant, RFC 7231 indique

les méthodes GET et HEAD NE DEVRAIENT PAS avoir la signification de prendre une action autre que la récupération. Ces méthodes doivent être considérées comme "sûres".

Par conséquent, si un site Web est resté conforme à la norme et n'implémente que des actions "non sécurisées" en tant que POST, alors seules les requêtes POST sont vulnérables. Cependant, de nombreux sites Web ne le font pas pour toutes leurs actions "dangereuses" - par exemple, la fonctionnalité de déconnexion est souvent négligée.

Bien que PUT soit sûr sans CORS , ce n'est pas la bonne méthode à utiliser ici. Si vous implémentez la protection CSRF, une bonne méthode pour protéger les requêtes XHR consiste à ajouter un en-tête tel que X-Requested-With à vos demandes puis validez cet en-tête côté serveur. Vous pouvez combiner cela avec une valeur aléatoire qui est vérifiée côté serveur pour ajouter une protection supplémentaire dans le cas de plugins de navigateur comme Flash contenant des vulnérabilités qui autorisent accidentellement l'en-tête. Voir cette réponse et celle-ci .

10
SilverlightFox

[~ # ~] get [~ # ~] and [~ # ~] post [~ # ~] peuvent tous deux être vulnérables à CSRF à moins que le serveur met en place un solide mécanisme Anti-CSRF, le serveur ne peut pas compter sur le navigateur pour empêcher les requêtes interdomaines. Quant aux requêtes PUT, il y a une légère différence, théoriquement elle est vulnérable aussi, cependant, elle nécessite que les circonstances soient plus propices. Voici pourquoi:

Alors que GET et POST peuvent être facilement effectuées via des formulaires HTML, des images, des balises de script, etc., faire une demande PUT est légèrement plus compliqué, vous ne pouvez pas faire de demande PUT sans que le navigateur interfère avec la requête.

Si vous utilisez l'API XmlHttpRequest pour définir la méthode de demande comme PUT, le navigateur envoie d'abord un [~ # ~] cors [~ # ~] (Cross Origin Resource Sharing) 'pre-flight' demande au serveur cible cherchant essentiellement l'autorisation de faire la demande, ce qui se produit est qu'une demande [~ # ~] options [~ # ~] est envoyée au serveur cible avec un en-tête défini sur Origin de la demande, dites: http://example.com (où votre script est hébergé) et Access-Control-Request-Method et Access-Control-Request-Headers. Si le serveur répond avec Access-Control-Allow-Origin: http://example.com, alors le navigateur envoie votre demande. De manière pertinente, vous devez que le serveur renvoie la valeur de l'en-tête Origin comme serveur, si l'en-tête Origin est défini sur '*', alors les informations d'identification ne peuvent pas être envoyé avec la demande. Comme faire une demande PUT avec des informations d'identification (cookies) à un serveur qui autorise Origine: * n'est pas autorisé. De https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS :

Demandes de contrôle en amont

Contrairement aux demandes simples (décrites ci-dessus), les demandes "de contrôle en amont" envoient d'abord une demande HTTP par la méthode OPTIONS à la ressource de l'autre domaine, afin de déterminer si la demande réelle peut être envoyée en toute sécurité. Les demandes intersites sont contrôlées en amont comme ceci car elles peuvent avoir des implications sur les données des utilisateurs. En particulier, une demande est contrôlée en amont si:

Il utilise des méthodes autres que GET, HEAD ou POST. En outre, si POST est utilisé pour envoyer des données de demande avec un type de contenu autre que application/x- www-form-urlencoded, multipart/form-data ou text/plain, par exemple si la demande POST envoie une charge utile XML au serveur en utilisant application/xml ou text/xml, puis la demande est pré-contrôlé. Il définit des en-têtes personnalisés dans la demande (par exemple, la demande utilise un en-tête tel que X-PINGOTHER)

Donc, mener une attaque CSRF contre une page qui utilise PUT est légèrement plus difficile, car cela nécessite la coopération du serveur cible. Cependant, ce ne doit pas être utilisé comme mécanisme anti-CSRF viable car les caprices du navigateur peuvent rendre ce mécanisme de protection inutile.

En outre, en ce qui concerne les circonstances qui peuvent rendre la dépendance à la méthode PUT comme protection ont été bien résumées dans cette réponse: https://stackoverflow.com/a/11972282/4399898

J'espère que cela a aidé.

3
racec0ndition

La méthode; c'est-à-dire que mettre, publier, supprimer, demander, obtenir, etc., de l'envoi de données n'est pas pertinent. Une attaque CSRF (Cross Site Request Forgery) permet d'injecter et de traiter du contenu non approuvé par le serveur Web.

1
jas-