Page 1 sur 1

Requêtes HTTP

Posté : 22 mai 2007, 18:59
par Ouaibou
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

Posté : 23 mai 2007, 00:38
par apatride
J'ai fait cela en utilisant la librairie CURL.
C'est une suggestion.

Posté : 23 mai 2007, 12:02
par Ouaibou
Merci pour ta réponse, mais cela te permet il de passer via les cookies/session, ou es-ce tout simplement "impossible" ?

Posté : 23 mai 2007, 12:17
par Invité
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);
?>

Posté : 23 mai 2007, 12:20
par Ouaibou
Ok merci bien je vais tester :)