Requêtes HTTP

Eléphant du PHP | 281 Messages

22 mai 2007, 18:59

Bonsoir,

La question ne fait pas vraiment partie de la rubrique PHP mais je ne savais trop ou la poster :

J'ai réalisé une petite classe dans le but d'envoyer des données POST et de récupérer des pages. Mon but est de m'identifier sur un site de jeu en ligne et de récupérer la page une fois authentifié. Ainsi je pourrai traiter certaines données afin de faire un service d'alerte d'attaques, etc.

Voici les deux méthodes principales :
/**
	 * Fonction HTTP get
	 *
	 **/
	public function get($url)
	{
		$buffer = '';
		$url = parse_url($url);
		$port = isset($url['port']) ? $url['port'] : 80;

		if (!$fp = fsockopen($url['host'], $port, $errno, $errstr)) {
			echo 'Erreur n°'.$errno.' : '.$errstr;
			return false;
		}
		else {
			$request = "GET ".$url['path']." HTTP/1.1\r\n";
	    	$request .= "Host: ".$url['host']."\r\n";
	    	$request .= "Connection: Close\r\n\r\n";
			
			fwrite($fp, $request);
			
			while (!feof($fp)) {
		        $buffer .= fgets($fp, 128);
		    }
		
		    fclose($fp);
		}
		
		return $buffer;
	}
	
	/**
	 * Fonction HTTP post
	 *
	 * @return boolean
	 **/
	public function post($url, $array)
	{
		$args = http_build_query($array);
		$url = parse_url($url);
		$port = isset($url['port']) ? $url['port'] : 80;
		
		if (!$fp = fsockopen($url['host'], $port, $errno, $errstr)) {
			echo 'Erreur n°'.$errno.' : '.$errstr;
			return false;
		}
		else {
			$request = "POST ".$url['path']." HTTP/1.1\r\n";
			$request .= "Host: ".$url['host']."\r\n";
			$request .= "User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X; fr; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3\r\n";
			$request .= "Content-type: application/x-www-form-urlencoded\r\n";
			$request .= "Content-length: ".strlen($args)."\r\n\r\n";
			$request .= $args."\r\n";
			
			fwrite($fp, $request);
			fclose($fp);
			
			return true;
		}
	}
La fonction get et post me semble fonctionner. Cependant j'ai un problème lorsque j'essai de m'identifier et que je récupère la page.

Il m'est affiché :
Votre session a expiré, reconnectez-vous !
Je penses que cela provient des cookies.
Apparemment lors de l'identification il est créé un cookie temporaire de la durée de la session sur la page. Je me demande donc si il serait possible d'éviter cela en stockant par exemple le cookie quelque part et ensuite l'utiliser lors de la requête GET, etc. ou bien le problème provient de ma requête POST mal formulée ?

Merci

Cordialement,
Laurent
Modifié en dernier par Ouaibou le 27 mai 2007, 10:56, modifié 1 fois.

Eléphanteau du PHP | 13 Messages

23 mai 2007, 00:38

J'ai fait cela en utilisant la librairie CURL.
C'est une suggestion.
Si vis pacem para bellum

Eléphant du PHP | 281 Messages

23 mai 2007, 12:02

Merci pour ta réponse, mais cela te permet il de passer via les cookies/session, ou es-ce tout simplement "impossible" ?

Invité
Invité n'ayant pas de compte PHPfrance

23 mai 2007, 12:17

Je t'envoie un bout de script qui utilise la librairie CURL.
Je l'ai utilisé pour accéder à une page filtrée par un (login/password) et(/ou) franchir un proxy.
CURL gère les cookies de sessions.
On peut en garder une copie en local, pour voir.
<?php

function checkSet($val)
{
	if (!(isset($val)))
	{
//		echo "Attention : paramètre indéfinit<br>\n";
	}	
}
function openRessource()
{
	$ressource = curl_init();
//	echo "La ressource:".$ressource."<br>";
	return $ressource;
}

function closeRessource($ress)
{
	checkSet($ress);

	// vérification des erreurs
	if (curl_errno($ress)) {
	    print curl_error($ress);
	}

	// fermeture des ressources	
	curl_close($ress);
//	echo "<br>Ressource fermée.<br>";
}

function setOption($ress,$name,$val)
{
	checkSet($ress);
	checkSet($name);
	checkSet($val);

//	echo "<hr>".$name."=".$val.":";
//	echo curl_setopt($ress, $name, $val);
	curl_setopt($ress, $name, $val);
//	echo "<br>";
}

function configureRessource_for_company($ress)
{
	checkSet($ress);

	//TRUE pour effectuer un tunnel à travers un proxy HTTP.
//	setOption($ress,CURLOPT_HTTPPROXYTUNNEL,1);

	//Le nom du proxy HTTP au tunnel qui le demande.
	setOption($ress,CURLOPT_PROXY, "XX.XXX.XX.XX:XXX");

	//Un nom d'utilisateur et un mot de passe formattés sous la forme "[username]:[password]" à utiliser pour la connexion avec le proxy.
	setOption($ress,CURLOPT_PROXYUSERPWD, "login proxy:password proxy");

	return true;
}

function configureRessource_core($ress)
{
	global $COOKIENAME;
	checkSet($ress);

	//Le fichier où sera écrit le transfert. Par défaut, STDOUT (la fenêtre du navigateur).
	//curl_setopt($ch, CURLOPT_FILE, $fp);

	//TRUE pour inclure l'en-tête dans la valeur de retour.
//	setOption($ress,CURLOPT_HEADER, 1);
	setOption($ress,CURLOPT_HEADER, 0);

	//Le contenu de l'en-tête "User-Agent: " à utiliser dans une requête HTTP.
	setOption ($ress, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");

	//curl_setopt ($ress, CURLOPT_DEBUGFUNCTION, 1)

	//TRUE pour suivre toutes les en-têtes "Location: " que le serveur envoie dans les en-têtes HTTP
	setOption($ress, CURLOPT_FOLLOWLOCATION, 1);

	//TRUE pour fixer automatiquement le champ Referer: dans les requêtes où une redirection Location: suit.
	setOption($ress, CURLOPT_AUTOREFERER, 1);

	//La méthode d'identification HTTP à utiliser.
	setOption($ress,CURLOPT_HTTPAUTH, CURLAUTH_ANY);

	//setOption($ress,CURLOPT_SSL_VERIFYPEER,true);
	setOption($ress,CURLOPT_SSL_VERIFYHOST, false);
	setOption($ress,CURLOPT_SSL_VERIFYPEER,false);

	//TRUE pour afficher tous les événements. Écrit la sortie sur stderr ou dans le fichier spécifié en utilisant CURLOPT_STDERR.
	setOption($ress,CURLOPT_VERBOSE,1);
		
	//retourne directement le transfert sous forme de chaîne de la valeur retournée par curl_exec() au lieu de l'afficher directement.
	setOption($ress,CURLOPT_RETURNTRANSFER,1);
	
	//TRUE pour marquer ceci comme un nouveau cookie "session".
//	setOption ($ress, CURLOPT_COOKIESESSION, 1);

	setOption ($ress,CURLOPT_COOKIEFILE,$COOKIENAME);
	setOption ($ress,CURLOPT_COOKIEJAR,$COOKIENAME);

	return true;
}

function configureRessource($ress)
{
	checkSet($ress);

	$toReturn = true;
/*	if ($toReturn)
	{
		$toReturn = configureRessource_for_company($ress);
	}
*/
	if ($toReturn)
	{
		$toReturn = configureRessource_core($ress);
	}
	return $toReturn;
}

function openPage_Core($ress,$url,$post)
{
	checkSet($ress);
	checkSet($url);
	checkSet($post);

	if ($post)
	{
		configureRessource_for_post($ress);
	}
	setOption($ress, CURLOPT_URL, $url);

	return curl_exec($ress);
}

function openPage($url,$post,$cookieBackupName="")
{
	global $COOKIENAME;
	checkSet($url);
	checkSet($post);

	$toReturn = "";

	if (!($ressource = openRessource()))
	{
		echo "Il n'y a pas de ressource<br>\n";
	}
	else
	{
		if (!(configureRessource($ressource)))
		{				
			echo "Impossible de configurer la ressource<br>\n";
		}
		else
		{
			if (!($toReturn = openPage_Core($ressource,$url,$post)))
			{
				echo "Impossible d'ouvrir l'url";	
			}
		}
		closeRessource($ressource);
		if($cookieBackupName)
		{	
			duplicateFile($COOKIENAME,$cookieBackupName);
		}

	}
	return $toReturn;
}
//echo openPage("TON URL",false);
?>

Eléphant du PHP | 281 Messages

23 mai 2007, 12:20

Ok merci bien je vais tester :)