samedi 25 avril 2009

AJAX et PHP protégez vos requêtes http

Lorsque on développe des applications PHP avec une interface AJAX, on ne peut jamais être sûre que les requêtes reçus par le serveur proviennent de votre application et c’est requêtes peuvent être plus au moins dangereuse pour votre system.

Pour parier a ce problèmes nous allons mettre un grade-fou qui va rejeté toutes requêtes provenant d’un domaine inconnu.

La technique consiste a fixé une variable pour chaque session qui sera transmise au client lors de ça création et qui va servir d’identité pour nos requêtes, si par hasard nous recevons une requêtes n’incluant pas cette variable celle-ci sera automatiquement rejeté.

Mise en œuvre

index.php
session_start();

 if (!isset($_SESSION['token']))
 {
  $token = md5(uniqid(rand(),TRUE)); //création et cryptage de id
  $_SESSION['token'] = $token; // sauvgarde de id
  setcookie('token',$_SESSION['token'],time()+3600); //expédition de id au client
 }

Nous créons d’abord un index unique que nous allons crypter en MD5 ensuite nous sauvegardons celui-ci dans la variable de session $_SESSION[‘token’] et finalement nous l’expédions au client sous forme de cookies.

myfile.js
function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

readCookie est une fonction classique pour récupérer la valeur d’un cookies par son nom, vous pouvez utiliser la fonction prédéfinis de votre Framework AJAX si elle existe.

myfile.js
token = readCookie('token');
$.post("test.php", { token: token });

Nous envoyons notre demande au serveur avec notre id,j’ai pris comme exemple une requête post JQuery étant le Framework le plus utilisé.

test.php
if ($_POST['token'] == $_SESSION['token'])
	   {
	   //	exécuter votre traitement 
	   	
	   } 

Coté serveur nous testons la similitude de l’ID envoyé par le client et celui sauvegardé au niveau de notre serveur si c’est le cas nous pouvons exécuter tranquillement notre traitement.