Un client HTTP / proxy en PHP

Comment utiliser cURL pour contacter un autre serveur ?

06 juillet 2011

De nos jours, il est de plus en plus fréquent d'avoir besoin de communiquer avec un serveur tiers afin qu'il nous fournisse des services. Par exemple le raccourcisseur d'URL de ce site qui fait appel au service de tourl.fr.

Il nous faut donc :

  • Une classe qui permet de ne pas dupliquer le code.
  • Un seul point d'entrée / sortie de l'application pour minimiser les failles de sécurité.
  • Un contrôle des données entrantes pour éviter de se faire injecter du code ou autres.
Un composant qui permet de centraliser les entrées / sorties et de contrôler le traffic est un type de proxy. Beaucoup croient à tord qu'un proxy est une machine qui leur interdit de jouer pendant leur temps de travail, mais en réalité c'est un design pattern logiciel. Dans le domaine des réseaux, par abus de langage, l'on nomme aussi proxy la machine (serveur mandataire) qui fait tourner un service logiciel de type proxy, mais ceci n'est qu'un exemple parmis tant d'autres.

Quelques définitions

  • Client URL Request Library (cURL) : Bibliothèque permettant de récupérer, créer ou modifier une ressource désignée par une URL. cURL est installée par défaut sur la plupart des serveurs web.
  • Proxy : Composant logiciel qui se place entre deux autres pour faciliter ou surveiller les échanges.
  • Client HTTP : Une entité qui envoie des requêtes vers un serveur HTTP et qui traite la réponse. Les clients HTTP les plus courants sont les navigateurs web.
  • Service Web (WS) : Programme qui permet la communication et l'échange de données entre applications.

Place à la pratique

Informatix_Proxy.php - La classe de proxy

/*
** Comme d'habitude dans les tutoriels c'est une classe de base
** qui nécessite d'être améliorée pour être opérationelle.
** Exemple : tester les valeurs de retour de curl_init,
** curl_setop, curl_exec et curl_close.
** Vérifier que l'URL est valide avec parse_url().
** etc...
*/
class Informatix_Proxy
{	
	public static function get($url)
	{
	if ($url != null)
	{
	/* Initialisation de la session curl. */
	$ch = curl_init();

	/* Mise en mode retour et non en mode affichage. */
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

	/* Saisie de l'URL */
	curl_setopt($ch, CURLOPT_URL, $url);

	/* Capture de l'URL, $retour contient donc le code de la page distante. */
	$retour = curl_exec($ch);

	/* Fermeture de la session. */
	curl_close($ch);
	}
	else
	return ('');
	
	return ($retour);
	}
}
	

test.php - Un exemple d'utilisation

$retourProxy = Informatix_Proxy::get($url);
	
if (preg_match("/contrôle des données/", $retourProxy) OR $retourProxy == '')
{
	return ('Site distant injoignable.');
}

return ($retourProxy);
	

Dans le cas du raccourcisseur d'URL, depuis votre navigateur (un client HTTP) vous avez à votre disposition le bouton (qui déclenche l'envoie d'une requête et la réception du message) et l'URL à raccourcir. Mais alors, pourquoi envoyer une requête vers le serveur d'Informatix pour que lui envoie une autre requête vers le raccourcisseur ; pourquoi ne pas contacter directement le raccourcisseur depuis le client ?

  • Pour centraliser les requêtes vers l'externe à l'aide d'une classe comme celle décrite ci-dessus.
  • Mais la raison la plus importante c'est que dans la majorité des cas il est interdit de faire une telle chose. La plupart des serveurs HTTP savent reconnaître les requêtes provenant d'un client Javascript avec lequel ils ne sont pas liés. Pour des raisons de sécurité (failles XSS, XST, CSRF) ces requêtes sont ignorées.

Par
Créateur et administrateur.

Dans la même catégorie

Formater un tableau pour CURLOPT_POSTFIELDS
Email avec pièce jointe en PHP
PHP : modifier les attributs privés d'un objet
Tester l'existence d'un fichier dans l'include path
Convertir récursivement un objet PHP en tableau
PHP : formater un tableau en CSV
Comment envoyer un mail en ligne de commande ?
RSYNC : Comment synchroniser des fichiers à travers une connexion ssh ?
Exécuter un code PHP en ligne de commande
Doctrine 2 : générer les classes PHP depuis la base de données
Comment catcher les erreurs en PHP ?
Doctrine 2 : comment afficher la requête SQL ?
Comment construire une URL sans caractères spéciaux en PHP ?
Comment lister les fichiers PHP inclus sur ma page ?
Les fonctions anonymes récursives en PHP
Requête HTTP asynchrone en PHP
La résolution statique à la volée ou Late Static Bindings
Trouver les jours fériés français en PHP
Comment allumer son ordinateur à distance en PHP ?
Comment utiliser la balise meta viewport ?
Une version mobile de mon site avec le Zend Framework
Doctrine et le Zend Framework : Présentation, intégration et utilisation
Créer son flux RSS simplement avec Zend_Feed
Appliquer un layout sur un mail avec le Zend Framework
Comment lancer une requête multi-bases avec les fonctions MySQL ?
Implode / Explode : Du tableau à la chaine de caractères, de la chaine de caractères au tableau

Commentaire(s)