sept 24 2008
L’XMLHttpRequest Cross Site en cours de spécification : Présentation
Une des principales restrictions de ceux qu’on appel vulgairement AJAX, c’est qu’il ne permet que peu d’interaction entre différent site, entre différent domaine pour des questions de sécurité. Mon article ne vise pas à présenter l’XMLHttpRequest en tant que tel mais une évolution en cours qu’est l’XMLHttpRequest Cross Domain, c’est à dire une requête AJAX vers un domaine différent.
Explication :
Actuellement si je suis sur le site www.sim07.net alors il m’est possible d’effectuer des requêtes AJAX que vers ce domaine pour des questions de sécurité. Pourtant moi, webmaster je sais très bien que www.sim07.net est très proche de simonrolland.fr, c’est en gros le même site et pourtant je ne peux effectuer directement mes requêtes.
La solution actuelle, le proxy
Actuellement on doit donc faire un mini proxy sur le domaine www.sim07.net pour effectuer la demande à simonrolland.fr. Shématiquement cela donne :

Le code du proxy est on ne peut plus simple, en PHP :
<?php
$s = file_get_contents(”http://simonrolland.fr/ajax.php”);
echo $s;
?>
Le chemin en bleu est bien sur plus rapide et c’est ce que permet l’XMLHttpRequest XDomain mais cela pose un certain nombre de problème de sécurité.
Plus qu’un simple changement de domaine
 Mon exemple simplifie un peu les choses, on peut très bien imaginer que la requête se fasse vers le même nom de domaine mais sur un port différent. Exemple, mon site est codé en PHP et tourne sur un serveur Apache2, sur www.sim07.net et implicitement le port 80, j’héberge mon JavaScript sur le sous domaine static.sim07.net et mes traitements serveur AJAX sont fait via un servlet Java sur un serveur Apache Tomcat sur le port 8080. Problème ! impossible depuis le domaine www.sim07.net d’effectuer une requête vers www.sim07.net:8080. Idem si on avait voulu faire la requête sur un hypothétique ajax.sim07.net.
La solution du W3C : Header HTTP ou XML
 Le W3C à produit un brouillon de travail sur le sujet et suggère plusieurs solutions. Firefox 3 dans ses versions Beta implantait ce brouillon mais il n’est plus possible de faire marcher les différents proof of concept hormis pour des extensions. Dommage mais sécurité oblige. J’ai eu beau chercher je n’ai pas trouver d’article relatif à ce sujet pour Firefox 3.1, donc à priori pas de changement.
La solution du W3C est vraiment pas mal, l’idée est de faire la requête qui dans l’en-tête HTTP de la réponse indique si le site est accepté ou pas, si tous les sites sont accepté, tous sauf etc …
Il faut donc rajouter :
header(”Access-Control: allow <www.sim07.net>”)
Internet Explorer …
Chez Microsoft on discute du sujet mais il n’y a pas beaucoup plus d’information sur le sujet en tout cas cela ne ressemble que peu aux spécifications du W3C.
Pour aller plus loin :
-  RequêtesXMLHttpRequest inter-sites sur Mozilla Developper Center
- Proof of concept sur Ajaxian

J’ai été contacté par email (durant mon footing (et oui le Geek fait du sport !)) par un “Chargé de Projet” chez Criteo, société qui semble pas à son coup d’essai vu 
