Firefox 3 implémente les "cross site XMLHttpRequest" !
Par Clochix le mercredi 8 août 2007, 21:56 - Lézarderies - Lien permanent
En parcourant la liste des
évolutions de la dernière version de test de firefox (FF 3a7) j'ai eu la
surprise de tomber sur cette note : Cross site XMLHttpRequest
specification implemented
. Firefox 3 pourra utiliser XMLHttpRequest pour
envoyer des requêtes ailleurs que sur le site d'origine de la page !
Firefox va donc lever une des principales limitations des technologies basées sur XHR. Celles-ci sont derrière certaines des évolutions les plus visibles du web de ces dernières années. Grosso-modo, il s'agit de mettre à jour une page de façon transparente, en faisant des appels au serveur mais sans recharger à chaque fois la page entière. Une des premières applications qui a popularisé ces technologies est Google maps : les cartes sont chargées dynamiquement au fur et à mesure de la navigation, sans que l'utilisateur ne perçoive de rechargement de la page. La plupart des applications dites "web 2.0" intègrent aujourd'hui des fonctionnalités basées sur XHR.
Mais, pour des raisons de sécurité, XHR ne peut récupérer des informations que sur le serveur sur lequel se trouve la page. Une page du domaine www.toto.org ne pourra pas utiliser XHR pour charger des données sur le domaine www.tutu.org. Des solutions de contournement existent (cf par exemple cette présentation de Joseph Smarr à l'OSCON 2006) et cette imitation n'est pas rédhibitoire, mais si Firefox la fait sauter, ça n'en rendra le développement d'applications web que plus confortable.
Si j'en crois les quelques documents que j'ai parcourus, l'implémentation dans Firefox repose sur 2 spécifications:
- un document de travail du W3C sur la gestion des droits d'accès inter sites. Ce document définit une méthode pour permettre à un site de préciser la politique d'accès à ses contenus depuis d'autres sites.
- la spécification de XMLHttpRequest a évolué pour gérer ces politiques de sécurité, cf http://lists.w3.org/Archives/Public...
Gestion des droit d'accès au niveau du site
La mise en place de politiques d'accès aux documents peut se faire soit via un entête HTTP, soit au moyen d'un tag XML dans le document.
Les entêtes HTTP sont de la forme Content-Access-Control: allow <site> exclude <site>. Par exemple
Content-Access-Control: allow <*.example.org> exclude <*.public.example.org>signifie que la ressource est accessible à toutes les pages des sous-domaines de example.org, à l'exception de celles de public.example.orgContent-Access-Control: allow <toto.org> <*.titi.org>, deny <*.tata.org>siginie que le document est accessible aux pages de toto.org, de tous les sous-domaines de titi.org, mais explicitement interdite aux sous-domaines de tata.org.
Les documents XML peuvent inclure une instruction de la forme
<?access-control allow="allow.example.org" ?>. Pour les
détails de la syntaxe, reportez-vous au brouillon de la spec.
Avant d'autoriser l'accès à une ressource sur un autre site, le navigateur doit donc effectuer les vérifications suivantes:
- parser les entêtes HTTP et traiter les règles "content-access-control"
- si ces règles permettent l'accès et que le type MIME du document indique qu'il s'agit de XML, parser le document et traiter l'éventuelle instruction <?access-control ?> qui s'y trouve.
Nouveauté dans XMLHttpRequest
De nouveaux entêtes de requête ont été définis. Ces entêtes seront insérés
automatiquement par la méthode send() si l'URI de destination
n'appartient pas au site d'origine. On ne peut pas modifier ces entêtes avec
setRequestHeader(). Les nouveaux entêtes sont:
- Referer-Root avec le protocole, le nom de domaine et le port du site d'origine
- XMLHttpRequest-Security-Check utilisé uniquement si la méthode de la requête n'est ni GET ni POST
send effectuera les contrôles d'accès et n'accédera au document distant que s'ils sont positifs.
Plus d'infos dès que j'aurai eu le temps de tester, en attendant je vous conseille de jeter un oeil au wiki Mozilla qui donne plus de précisions, et notamment sur les nombreuses implications de cette évolution en matière de sécurité.
En tout cas, une raison de plus d'attendre avec impatience la sortie de
Firefox 3, le navigateur qui fait évoluer le web 
Commentaires
Je me demande ce que ça va donner en terme de sécurité.