Je suis assez nouveau en matière de sécurité, alors pardonnez ma question de base, mais SSL crypte-t-il les demandes POST mais pas GET?
Par exemple, si j'ai deux demandes
OBTENEZ: www.mycoolsite.com/index?id=1&type=xyz
POST
site: www.mycoolsite.com/index {Paramètres: id = 1 & type = xyz}
Est-il sûr de supposer que quelqu'un est capable d'intercepter toute la demande GET (lecture de l'identifiant et du type), mais s'il intercepte le POST, il pourra voir le chemin du site, mais parce qu'il va sur SSL, ils ne peuvent pas voir les paramètres d'id et de type?
Maintenant, la question est, savez-vous à quoi ressemble une requête HTTP ?
Eh bien, en supposant que non, voici un exemple:
GET /test?param1=hello¶m2=world HTTP/1.1
Host: subdomain.test.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:10.0.1) Gecko/20100101 Firefox/10.0.1
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive
Toutes toutes ces informations sont encapsulées dans le transport SSL - comme le dit gentiment le commentaire sur votre réponse. Ça signifie:
Ce qui n'est pas forcément sécurisé:
Host: something
paramètres afin que plusieurs domaines puissent être gérés par un serveur Web sur une interface et une adresse IP. De toute évidence, cet en-tête est crypté, cependant, si vous exécutez du trafic non https vers le site, il doit être clair à quels hôtes vous pouvez vous connecter. Même si ce n'est pas le cas, le DNS inversé vous dira certainement ce qui est hébergé sur cette IP et vous pouvez probablement faire une estimation raisonnable à partir de là.Les requêtes POST se ressemblent pour obtenir des requêtes, sauf qu'elles contiennent un corps. Cela peut ressembler à ceci:
POST /testpost HTTP/1.1
Host: subdomain.test.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:10.0.1) Gecko/20100101 Firefox/10.0.1
Accept: image/png,image/*;q=0.8,*/*;q=0.5
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive
param1=hello¶m2=hello
Il y a bien sûr des variantes plus compliquées, mais essentiellement elles sont toutes cryptées de toute façon.
Je n'ai pas vu cela mentionné dans les autres réponses, mais vous ne devriez généralement pas mettre d'informations secrètes (mots de passe) dans les requêtes GET même avec SSL, mais utilisez plutôt POST à la place. Pourquoi? L'URL avec le les informations sensibles seront généralement enregistrées aux deux extrémités; par exemple, dans la liste de l'historique de votre navigateur (https://www.example.com?user=me&password=MyPassword) ainsi que les journaux sur le serveur. POST les informations (en particulier avec les mots de passe) ne sont généralement pas écrites dans les journaux du serveur Web, bien qu'elles puissent évidemment être configurées pour être enregistrées - il est donc préférable de ne pas réutiliser (ou utiliser des mots de passe similaires) sur différents sites.
SSL crypte et garantit l'authenticité de toute la connexion, y compris la méthode et l'URL demandées. Un GET est tout aussi bien protégé qu'un POST.
Lorsque SSL fonctionne comme prévu, un espion ne peut voir que quelle adresse IP se connecte à quelle adresse IP (et sur quel port, mais c'est généralement 443), à quelle heure et combien. S'il y a plusieurs hôtes virtuels sur la même machine, l'attaquant ne peut pas savoir lequel vous contactez (cependant, l'écouteur peut voir vos requêtes DNS juste avant la requête HTTPS et faire une supposition plausible). Toutes ces informations sont également authentifiées: un attaquant actif ne peut pas jouer man-in-the-middle et modifier les données en transit.
Choses qui peuvent empêcher SSL de fonctionner comme prévu:
Voir aussi Comment est-il possible que des personnes observant une connexion HTTPS en cours d'établissement ne sachent pas comment la décrypter? pour quelques informations.
Juste pour ajouter un petit détail supplémentaire, sur la façon dont cela est accompli via HTTP.
Vous vous demandez probablement (ou vous devriez être, si vous connaissez la prise de contact SSL ), comment le canal SSL est créé, sans que la demande GET soit envoyée non chiffrée? Et si ma demande doit passer par un proxy - comment est-ce possible?
HTTP v1.1 a introduit une CONNECT méthode HTTP, qui envoie essentiellement une requête simplifiée au serveur via un proxy, contenant uniquement l'URL d'hôte la plus simple (sans aucune addition paramètres, en-têtes ou corps). Sur la base de cette demande, un tunnel SSL est construit, puis la demande GET (ou POST) d'origine est envoyée par-dessus.
Un autre point non mentionné est que si vous utilisez GET et que vous avez du contenu tiers intégré ou lié (annonces de site par exemple), ce site tiers obtiendra l'URL complète (avec des données de paramètres sensibles) dans l'en-tête Referer.
Cela expose les données à des tiers qui ne devraient pas les avoir.
Source: Réponse sur débordement de pile
méthode GET est destiné à la récupération de données uniquement et ne devrait pas avoir d'effets secondaires . Mais POST est destiné à cet usage spécifique: modifier les données côté serveur.
Les requêtes GET peuvent facilement être annulées (voir Falsification de requêtes intersites ) en plaçant simplement une image sur une page tout en forgeant POST ne sont pas si faciles (c'est aussi une raison pour laquelle vous ne devez autoriser que les POST requêtes) autorisées.