La requête GET est marginalement moins sûre que la requête POST. Aucune des deux n'offre une véritable "sécurité" en soi ; l'utilisation de requêtes POST ne sera pas Par magie, la sécurité de votre site Web contre les attaques malveillantes sera considérablement améliorée. Cependant, l'utilisation de requêtes GET puede rendre une application autrement sûre peu sûre.
Le mantra selon lequel vous "ne devez pas utiliser les requêtes GET pour effectuer des modifications" est toujours d'actualité, mais cela n'a pas grand-chose à voir avec les éléments suivants malveillant comportement. Les formulaires de connexion sont les plus susceptibles d'être envoyés en utilisant le mauvais type de demande.
Araignées de recherche et accélérateurs web
C'est la véritable raison pour laquelle vous devez utiliser les requêtes POST pour modifier les données. Les robots de recherche suivront tous les liens de votre site Web, mais ne soumettront pas les formulaires qu'ils trouvent au hasard.
Les accélérateurs Web sont pires que les araignées de recherche, car ils fonctionnent 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 cela nécessite un administrateur, obéira volontiers aux ordres de l'accélérateur web (non malveillant !) et de l'administrateur. supprimer tout ce qu'il voit .
Attaque d'un député confus
A attaque du député confus (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 tout aussi facile à soumettre sans interaction avec 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 (par exemple, un forum tiers) autorisent l'intégration d'images arbitraires (permettant à l'attaquant d'injecter une requête GET arbitraire), mais empêchent toutes les façons d'injecter une requête POST arbitraire, qu'elle soit automatique ou manuelle.
On pourrait arguer que les accélérateurs web sont un exemple d'attaque adjointe confuse, mais c'est juste une question de définition. En fait, un attaquant malveillant n'a aucun contrôle sur ce type d'attaque. attaque même si le député es confus.
Journaux proxy
Les serveurs mandataires sont susceptibles d'enregistrer les URL GET dans leur intégralité, sans supprimer la chaîne de requête. Les paramètres des requêtes 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 du TDP. Premièrement, le trafic non crypté peut être enregistré dans son intégralité ; un proxy malveillant a déjà tout ce dont il a besoin. Deuxièmement, les paramètres de la requête sont d'une utilité limitée pour un attaquant : ce dont il a réellement besoin, ce sont les cookies, et si la seule chose dont il dispose sont les journaux du proxy, il est peu probable qu'il puisse attaquer une URL GET ou POST.
Il y a une exception pour les demandes de connexion : celles-ci contiennent généralement le mot de passe de l'utilisateur. L'enregistrement de ce mot de passe dans le journal du proxy ouvre un vecteur d'attaque qui est absent dans le cas du POST. Cependant, la connexion via HTTP est de toute façon peu sûre par nature.
Cache du proxy
Les mandataires de mise en cache peuvent 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'efforts que la conversion de l'URL en un gestionnaire POST.
HTTP "Referer"
Si l'utilisateur navigue vers un site web tiers à partir de la page servie en réponse à une demande GET, ce site web tiers peut voir tous les paramètres de la demande GET.
Appartient à la catégorie "révèle les paramètres de la 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, mais pour exploiter la requête GET, un pirate 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 de rafraîchissement du navigateur
Le navigateur réessaie une requête GET dès que l'utilisateur appuie sur "rafraîchir". Il peut le faire lors de la restauration des onglets après une fermeture. Toute action (disons, 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 pour n'utiliser que des requêtes POST pour modifier des données, mais cela n'a rien à voir avec un comportement malveillant et, par conséquent, avec la sécurité.
Alors, que dois-je faire ?
- Utilisez uniquement des requêtes POST pour modifier les données, principalement pour des raisons non liées à la sécurité.
- N'utilisez que des requêtes POST pour les formulaires de connexion ; le contraire introduit des vecteurs d'attaque.
- Si votre site effectue des opérations sensibles, vous avez vraiment besoin de quelqu'un qui sait 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, Injection de script (XSS) , CSRF et des milliards d'autres choses qui peuvent être spécifiques à votre plate-forme (comme la vulnérabilité de l'affectation de masse dans divers frameworks) : ASP.NET MVC , Ruby on Rails etc.). Il n'existe aucun élément unique qui fera la différence entre "sûr" (non exploitable) et "non sûr".
Avec le protocole HTTPS, les données POST sont codées, mais les URL peuvent-elles être reniflées par une tierce partie ?
Non, ils ne peuvent pas être reniflés. Mais les URLs 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 à utiliser du code côté serveur pour traiter les informations sensibles ?
Cela dépend de sa sensibilité ou, plus précisément, de la manière dont elle l'est. Il est évident que le client le verra. Toute personne ayant un accès physique à l'ordinateur du client le verra. Le client peut le falsifier lorsqu'il vous le renvoie. Si ces éléments sont importants, alors oui, gardez les données sensibles sur le serveur et ne les laissez pas sortir.
1 votes
Il y a un bon article à ce sujet sur le blog de Jeff, Coding Horror : Les requêtes croisées et vous .
0 votes
N'utiliseriez-vous pas POST pour la plupart des choses. Par exemple, pour une API, disons que vous avez besoin de récupérer des données d'une base de données, mais avant que le serveur ne renvoie les données, vous devez d'abord être authentifié ? En utilisant post, vous passez simplement votre ID de session + tous les paramètres dont vous avez besoin pour la requête. Si vous utilisez une requête GET pour cela, votre ID de session peut facilement être retrouvé dans l'historique de votre navigateur ou quelque part au milieu.
0 votes
Je me souviens de cette discussion d'avant la guerre (99' ou 00 environ) lorsque https n'était pas répandu.
0 votes
@DavidTonhofer, à quelle guerre faites-vous référence ? La guerre des navigateurs ?
0 votes
@DeltaFlyer Non, la guerre éternelle contre les trucs, alias GWOT. Qu'avons-nous fait ?