La demande GET est légèrement moins sécurisée que la demande POST. Aucun des deux n'offre une véritable «sécurité» en soi; l'utilisation de requêtes POST ne sécurisera pas comme par magie votre site Web contre les attaques malveillantes. Cependant, l'utilisation de requêtes GET peut rendre une application autrement sécurisée non sécurisée.
Le mantra selon lequel "vous ne devez pas utiliser les requêtes GET pour apporter des modifications" est toujours très valable, mais cela n'a pas grand-chose à voir avec les programmes malveillants comportement . Les formulaires de connexion sont les plus sensibles à l'envoi en utilisant le mauvais type de demande.
Araignées de recherche et accélérateurs Web
C'est la vraie raison pour laquelle vous devez utiliser les requêtes POST pour modifier les données. Les araignées de recherche suivront tous les liens de votre site Web, mais ne soumettront pas de formulaires aléatoires qu'ils trouvent.
Les accélérateurs Web sont pires que les araignées de recherche, car ils s'exécutent sur la machine du client et "cliquent" sur tous les liens dans le contexte de l'utilisateur connecté . Ainsi, une application qui utilise une requête GET pour supprimer des éléments, même si elle nécessite un administrateur, obéira volontiers aux ordres de l'accélérateur Web (non malveillant!) Et supprimera tout ce qu'il voit .
Attaque d'un adjoint confus
Une attaque de député confuse (où le député est le navigateur) est possible, que vous utilisiez une requête GET ou POST .
Sur les sites Web contrôlés par des attaquants, GET et POST sont également faciles à soumettre sans interaction de l'utilisateur .
Le seul scénario dans lequel POST est légèrement moins sensible est que de nombreux sites Web qui ne sont pas sous le contrôle de l'attaquant (disons, un forum tiers) permettent d'incorporer des images arbitraires (permettant à l'attaquant d'injecter une demande GET arbitraire), mais empêchent tout les moyens d'injecter une requête POST arbitraire, qu'elle soit automatique ou manuelle.
On pourrait soutenir que les accélérateurs Web sont un exemple d'attaque adjointe confuse, mais ce n'est qu'une question de définition. Si quelque chose, un attaquant malveillant n'a aucun contrôle sur cela, il ne s'agit donc pas d'une attaque , même si le député est confus.
Journaux proxy
Les serveurs proxy sont susceptibles de consigner les URL GET dans leur intégralité, sans supprimer la chaîne de requête. Les paramètres de requête POST ne sont normalement pas enregistrés. Il est peu probable que les cookies soient enregistrés dans les deux cas.(exemple)
C'est un argument très faible en faveur de POST. Premièrement, le trafic non chiffré peut être enregistré dans son intégralité; un proxy malveillant possède déjà tout ce dont il a besoin. Deuxièmement, les paramètres de demande sont d'une utilité limitée pour un attaquant: ce dont ils ont vraiment besoin, ce sont les cookies, donc si la seule chose dont ils disposent sont des journaux de proxy, il est peu probable qu'ils puissent attaquer une URL GET ou POST.
Il existe une exception pour les demandes de connexion: celles-ci contiennent généralement le mot de passe de l'utilisateur. L'enregistrement dans le journal proxy ouvre un vecteur d'attaque absent dans le cas de POST. Cependant, la connexion via HTTP standard est de toute façon intrinsèquement non sécurisée.
Cache proxy
La mise en cache des proxys peut conserver les réponses GET, mais pas les réponses POST. Cela dit, les réponses GET peuvent être rendues non cachables avec moins d'effort que la conversion de l'URL en un gestionnaire POST.
HTTP "Referer"
Si l'utilisateur devait naviguer vers un site Web tiers à partir de la page servie en réponse à une demande GET, ce site Web tiers verrait tous les paramètres de la demande GET.
Appartient à la catégorie «révèle les paramètres de demande à un tiers», dont la gravité dépend de ce qui est présent dans ces paramètres. Les requêtes POST sont naturellement à l'abri de cela, mais pour exploiter la requête GET, un pirate informatique devrait insérer un lien vers son propre site Web dans la réponse du serveur.
Historique du navigateur
Ceci est très similaire à l'argument "proxy logs": les requêtes GET sont stockées dans l'historique du navigateur avec leurs paramètres. L'attaquant peut facilement les obtenir s'il a un accès physique à la machine.
Action d'actualisation du navigateur
Le navigateur va réessayer une requête GET dès que l'utilisateur frappe "Actualiser". Cela pourrait le faire lors de la restauration des onglets après l'arrêt. Toute action (par exemple, un paiement) sera donc répétée sans avertissement.
Le navigateur ne réessayera pas une demande POST sans avertissement.
C'est une bonne raison d'utiliser uniquement des requêtes POST pour modifier des données, mais cela n'a rien à voir avec un comportement malveillant et, par conséquent, la sécurité.
Donc qu'est ce que je devrais faire?
- Utilisez uniquement les demandes POST pour modifier les données, principalement pour des raisons non liées à la sécurité.
- Utilisez uniquement les demandes POST pour les formulaires de connexion; faire autrement introduit des vecteurs d'attaque.
- Si votre site effectue des opérations sensibles, vous avez vraiment besoin de quelqu'un qui sache ce qu'il fait, car cela ne peut pas être couvert par une seule réponse. Vous devez utiliser HTTPS, HSTS, CSP, atténuer l'injection SQL, l'injection de script (XSS) , CSRF et une multitude d'autres choses qui peuvent être spécifiques à votre plate-forme (comme la vulnérabilité d'affectation de masse dans divers cadres: ASP.NET MVC , Ruby on Rails , etc.). Il n'y a pas une seule chose qui fera la différence entre "sécurisé" (non exploitable) et "non sécurisé".
Sur HTTPS, les données POST sont encodées, mais les URL peuvent-elles être reniflées par un tiers?
Non, ils ne peuvent pas être reniflés. Mais les URL seront stockées dans l'historique du navigateur.
Serait-il juste de dire que la meilleure pratique consiste à éviter de placer des données sensibles dans le POST ou le GET et d'utiliser à la place du code côté serveur pour gérer les informations sensibles?
Cela dépend de sa sensibilité, ou plus précisément de quelle manière. De toute évidence, le client le verra. Toute personne disposant d'un accès physique à l'ordinateur du client le verra. Le client peut l'usurper en vous le renvoyant. Si cela importe, oui, conservez les données sensibles sur le serveur et ne les laissez pas partir.