Un client HTTP / proxy en PHPComment utiliser cURL pour contacter un autre serveur ? |
mercredi 06 juillet 2011 à 18:28
|
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.
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.
|
AuteurNicolas GAUTRONCréateur et administrateur. http://www.informatix.fr |
Dans la même catégorie
Une version mobile de mon site avec le Zend FrameworkDoctrine 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
Activer PHP5 sur un hébergement 1&1
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

