Je suis Charlie

Autres trucs

Accueil

Seulement les RFC

Seulement les fiches de lecture

Mon livre « Cyberstructure »

Ève

Quelles informations envoie réellement votre navigateur Web ?

Première rédaction de cet article le 1 décembre 2012


Supposons que vous soyiez un développeur Web qui veut savoir quelles sont les informations que le serveur distant récupère de son navigateur, afin d'améliorer une application. Ou que vous soyiez simplement un curieux qui veut connaître ce qui se passe sur le réseau. Bien sûr, vous pouvez toujours demander au navigateur d'afficher cette information (par exemple avec l'extension Live HTTP Headers de Firefox). Ou vous pouvez utiliser un programme d'espionnage du réseau comme Wireshark. Mais ils ne vous donnent qu'une vision locale, ce qu'envoie le client. Si la requête est modifiée en route (routeur NAT, relais HTTP), ce que verra le serveur n'est pas forcément ce que le client aura envoyé. D'où l'intérêt des sites Web qui affichent cette information.

J'en connais trois qui permettent de retourner les données vues par le serveur sous une forme structurée, analysable par un programme (tous les trois font du JSON, cf. RFC 8259). Mais, si vous en trouvez d'autres, je suis preneur :

  • http://httpbin.org/ est le plus riche en fonctions (possibilité de n'envoyer qu'une partie des données, possibilité d'introduire un retard artificiel, etc). Mais il ne marche qu'en IPv4.
  • http://echohttp.com/, lui, fonctionne en IPv6.
  • Et j'ai réalisé un tel service, https://www.bortzmeyer.org/apps/http, fait en WSGI. Contrairement aux précédents, son source (il est vrai que c'est assez trivial) est disponible (dans wsgis/dispatcher.py dans l'archive des fichiers de ce blog). Il semble être le seul à afficher le nom correspondant à l'adresse IP du client (oui, vous pourriez faire un dig vous-même mais, dans certains cas, la résolution d'adresse en nom ne donne pas le même résultat de partout). Ce nom est dans le champ origin_name (s'il existe : toutes les adresses IP ne pointent pas vers un nom).

Voici des exemples d'utilisation avec curl, montrant le JSON produit :

% curl http://httpbin.org/get
{
  "url": "http://httpbin.org/get",
  "headers": {
    "Content-Length": "",
    "Connection": "keep-alive",
    "Accept": "*/*",
    "User-Agent": "curl/7.21.0 (i486-pc-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.15 libssh2/1.2.6",
    "Host": "httpbin.org",
    "Content-Type": ""
  },
  "args": {},
  "origin": "192.0.2.187"
}
% curl http://echohttp.com/echo
{
  "version" : "HTTP/1.0",
  "method" : "GET",
  "path" : "/echo",
  "decode_path" : {
    "path" : "/echo",
    "query_string" : "",
    "qs" : {
      
    },
    "path_info" : [
      
    ]
  },
  "headers" : {
    "Accept" : "*/*",
    "User-Agent" : "curl/7.21.0 (i486-pc-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.15 libssh2/1.2.6",
    "Connection" : "close",
    "X-Forwarded-For" : "2001:db8:8bd9:8bb0:da:8aa3:5f22:df56",
    "X-Real-Ip" : "2001:db8:8bd9:8bb0:da:8aa3:5f22:df56",
    "Host" : "echohttp.com"
  },
  "body" : "",
  "json" : {
    
  },
  "form" : {
    
  }
}
% curl https://www.bortzmeyer.org/apps/http
{
  "origin": "2001:db8:8bd9:8bb0:da:8aa3:5f22:df56", 
  "headers": {
    "HOST": "www.bortzmeyer.org", 
    "USER_AGENT": "curl/7.21.0 (i486-pc-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.15 libssh2/1.2.6", 
    "ACCEPT": "*/*"
  }, 
  "method": "GET",
  "origin_name": "test.bortzmeyer.org"
}

Bien sûr, votre navigateur Web envoie d'autres informations, par exemple par les cookies. (Une excellente application pratique de ces informations, pour montrer la facilité à repérer un utiisateur unique, est le Panopticlick.) Mais on s'est limité ici aux informations strictement HTTP.

Version PDF de cette page (mais vous pouvez aussi imprimer depuis votre navigateur, il y a une feuille de style prévue pour cela)

Source XML de cette page (cette page est distribuée sous les termes de la licence GFDL)