Ce post se veut une aide pour déterminer la perte d'informations avérée en fonction du type de méthode d'envoi de données utilisé.
Petit rappel important au sujet de ces deux méthodes :
Il faut être clair que, si on utilise GET ou POST les données circulent en clair, nous ne sommes pas la pour affirmer autre chose, mais plutôt pour déterminer les risques de fuite d'informations dans les logs serveur, le navigateur (y compris le cache), les proxy (ou tout autre élément sur la ligne entre le navigateur et l'applicatif).
Ces deux méthodes sont définies dans le
RFC 2616 de la manière suivante (copier/coller du RFC en italique, explication autrement) :
GET :
The GET method means retrieve whatever information (in the form of an
entity) is identified by the Request-URI. If the Request-URI refers
to a data-producing process, it is the produced data which shall be
returned as the entity in the response and not the source text of the
process, unless that text happens to be the output of the process.
Ici les données sont envoyés dans l'URL uniquement.
L'URL n'étant pas limitée d'après le RFC 2616, bien qu'en pratique je n'ai jamais aperçu une URL de 50Ko....
The HTTP protocol does not place any a priori limit on the length of
a URI. Servers MUST be able to handle the URI of any resource they
serve, and SHOULD be able to handle URIs of unbounded length if they
provide GET-based forms that could generate such URIs. A server
SHOULD return 414 (Request-URI Too Long) status if a URI is longer
than the server can handle (see section 10.4.15).
Note: Servers ought to be cautious about depending on URI lengths
above 255 bytes, because some older client or proxy
implementations might not properly support these lengths.
POST :
The POST method is used to request that the origin server accept the
entity enclosed in the request as a new subordinate of the resource
identified by the Request-URI in the Request-Line. POST is designed
to allow a uniform method to cover the following functions:
- Annotation of existing resources;
- Posting a message to a bulletin board, newsgroup, mailing list,
or similar group of articles;
- Providing a block of data, such as the result of submitting a
form, to a data-handling process;
- Extending a database through an append operation.
Ici les données du formulaire sont envoyées dans le corps de la requête après les entêtes. Et donc la limite n'existe pas non plus(cf
RFC1867). Par contre ici on rencontre régulièrement des données de plusieurs Ko/Mo...
Donc concernant ces deux méthodes :
- En GET toutes les données sont forcément envoyées dans l'URL.
- En POST les données sont généralement envoyées en corps de message, mais peuvent aussi être passées dans l'URL
Donc en prenant ces deux méthodes et une combinaison HTTP/HTTPS on peut déterminer les points suivants :
Dans l'historique du navigateur
- Utilisation de HTTP + GET => Perte de confidentialité; les arguments apparaissent dans l'URL et donc dans l'historique
- Utilisation de HTTPS + GET => Perte de confidentialité; les arguments apparaissent dans l'URL et donc dans l'historique
- Utilisation de HTTP + POST + données dans l'URL => Perte de confidentialité; les arguments apparaissent dans l'URL et donc dans l'historique
- Utilisation de HTTPS + POST + données dans l'URL => Perte de confidentialité; les arguments apparaissent dans l'URL et donc dans l'historique
- Utilisation de HTTP + POST + données dans le corps du message => Pas de perte de confidentialité; il n'apparait que l'URL dans l'historique.
- Utilisation de HTTPS + POST + données dans le corps du message => Pas de perte de confidentialité; il n'apparait que l'URL dans l'historique. Cette méthode est malgré tout a préférer à la précédente étant donnée qu'elle chiffre le trafic :)
Dans le cas d'une écoute de trafic (type Homme du milieu) :
- Utilisation de HTTP + GET => Perte de confidentialité; les arguments sont lisibles sur le canal
- Utilisation de HTTPS + GET => Pas de perte de confidentialité; le trafic est entièrement chiffré.
- Utilisation de HTTP + POST + données dans l'URL => Perte de confidentialité; les arguments sont lisibles sur le canal
- Utilisation de HTTPS + POST + données dans l'URL => Pas de perte de confidentialité; le trafic est entièrement chiffré.
- Utilisation de HTTP + POST + données dans le corps du message => Perte de confidentialité; les arguments sont lisibles sur le canal
- Utilisation de HTTPS + POST + données dans le corps du message => Pas de perte de confidentialité; le trafic est entièrement chiffré.
Dans les logs du serveur (si le pirate réussi à accéder a ceux-ci)
- Utilisation de HTTP + GET => Perte de confidentialité; les arguments apparaissent dans l'URL et donc dans les logs
- Utilisation de HTTPS + GET => Perte de confidentialité; les arguments apparaissent dans l'URL et donc dans les logs
- Utilisation de HTTP + POST + données dans l'URL => Perte de confidentialité; les arguments apparaissent dans l'URL et donc dans les logs
- Utilisation de HTTPS + POST + données dans l'URL => Perte de confidentialité; les arguments apparaissent dans l'URL et donc dans les logs
- Utilisation de HTTP + POST + données dans le corps du message => Pas de perte de confidentialité; il n'apparait que l'URL dans les logs.
- Utilisation de HTTPS + POST + données dans le corps du message => Pas de perte de confidentialité; il n'apparait que l'URL dans les logs. Cette méthode est malgré tout a préférer à la précédente étant donnée qu'elle chiffre le trafic :)
On peut donc dire que la meilleure méthode exposant le moins de données et de perte de confidentialité dans le cas d'une analyse des risques, reste le POST avec les données dans le Corps du message, tout cela étant chiffré en HTTPS....Mais on n'avait pas besoin de toute cette démonstration pour le savoir.