IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

file_get_contents() et authentification


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 64
    Points : 37
    Points
    37
    Par défaut file_get_contents() et authentification
    Bonjour,

    Je souhaite récupérer des données d'un site web en utilisant un script php incluant des requêtes XPath.
    En essayant d'accéder à la page voulue, une erreur 401 se produit car je dois être authentifié sur ce site.
    J'ai donc changé mon script en passant un context à ma fonction file_get_contents(). Ce context comprend l'identifiant et le mot de passe de mon compte.

    Problème : le file_get_contents() me retourne le code html de la page de connexion et non pas de la page souhaitée passée en paramètre.

    Mon interprétation :
    1/ Je tente de récupérer le contenu de la page souhaitée.
    2/ Le serveur redirige vers la page de connexion.
    3/ Le serveur utilise l'id et le mot de passe du context pour l'authentification.
    4/ L'authentification est un succès.
    5/ file_get_contents() me retourne l'html de la page de connexion car la redirection vers la page souhaitée ne se fait pas.

    Question : Pourquoi ? Est-il possible de récupérer le contenu souhaité ? Quelle est la démarche ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    <?php
     
    		// L'URL de la page souhaitée.
    		$url = 'http://page_que_je_veux/';
     
    		// Encodage de l'autentification
    			$auth = base64_encode('user:pass:token');
     
    		// Création des options de la requête
    			$opts = array(
    				'http' => array (
    					'method'=>'POST',
    					'header'=>"Authorization: Basic $auth"
    				),
    				'https' => array (
    					'method'=>'POST',
    					'header'=>"Authorization: Basic $auth"
    				)
    			);
     
    		// Création du contexte de transaction
    		$context = stream_context_create($opts);
     
    		// Récupération du contenu HTML de la page.
    		$html = file_get_contents($url, false, $context);
     
    		// Cet echo montre bien que je retourne le contenu de la page de log et non pas de la page que je veux.
    		echo $html;
     
    ?>

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Qu'est ce qui te permet de dire que l'authentification est un succès ?
    Si tu as une page de connexion avec un formulaire, il est peu problème que ce soit une authentification Apache comme tu le fais.
    Il faut te tourner vers cURL un envoi POST avec session PHP.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 64
    Points : 37
    Points
    37
    Par défaut
    Bonjour,

    Je me suis inspiré des informations trouvées sur ce site :
    https://www.sitepoint.com/using-curl...mote-requests/

    J'ai fait un premier curl sur la page de login puis un second sur la page que je veux récupérer.
    Aucune erreur n'est retournée, une fois de plus, mais le echo du contenu de la page me retourne le contenu de la page de log.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    		$ch = curl_init();
     
    // Préparation des données pour l'authentification.
    // Je souhaite bien ensuite être redirigé vers la page que je veux récupérer ($url_wanted).
    		$postData = array(
    			'signin[username]' => $username,
    			'signin[password]' => $password,
    			'signin[_csrf_token]' => $token,
    			'redirect_to' => $url_wanted,
    			'testcookie' => '1'
    		);
     
    // Curl pour s'authentifier sur la page de log.
    		curl_setopt_array($ch, array(
    			CURLOPT_URL => $url_log,
    			CURLOPT_RETURNTRANSFER => true,
    			CURLOPT_POST => true,
    			CURLOPT_POSTFIELDS => $postData,
    			CURLOPT_FOLLOWLOCATION => true,
    			CURLOPT_COOKIESESSION => true,
    			CURLOPT_COOKIEJAR => 'cookie.txt'
    		));
     
    		$output = curl_exec($ch);
    		curl_close($ch);
    		echo $output;
     
    // Curl pour récupérer le contenu de la page url_wanted en réutilisant le log précédent.		
    		$ch = curl_init();
    		curl_setopt_array(
    			$ch, array( 
    			CURLOPT_URL => $url_wanted,
    			CURLOPT_RETURNTRANSFER => true,
    			CURLOPT_COOKIEJAR => 'cookie.txt',
    			CURLOPT_COOKIEFILE => 'cookie.txt'
    		));
     
    		$output = curl_exec($ch);
    		curl_close($ch);
     
    // Le echo ci-dessous me retourne le contenu de la page de log ($url_log) et pas celui de la page $url_wanted.
    		echo $output;
    Suis-je sur la bonne voie ? Quelles sont mes erreurs ?

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu as bien défini $token ?

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 64
    Points : 37
    Points
    37
    Par défaut
    Oui, rien de spécial :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $token = '0ghc8e94949584ue09b47e67e3c45c80f';

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 64
    Points : 37
    Points
    37
    Par défaut
    J'ai aussi remarqué que dans le html retourné (html de la page de log donc), il est inscrit "CSRF ATTACK DETECTED".
    Est-il possible que le serveur bloque le script ?
    Toute aide est bienvenue, je lutte sur ce problème depuis plusieurs jours.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 64
    Points : 37
    Points
    37
    Par défaut
    Je viens de faire des changements pour prendre en compte ce problème de csrf mais rien n'y fait.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    	// Récupération du token
    	$url = $url_log;
    	$ch = curl_init();
     
    	curl_setopt($ch, CURLOPT_URL, $url);
    	curl_setopt($ch, CURLOPT_COOKIEJAR, $path);
    	curl_setopt($ch, CURLOPT_COOKIEFILE, $path);
     
    	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    	$response = curl_exec($ch);
    	if (curl_errno($ch)) die(curl_error($ch));
     
    		// Pour éviter les Warnings : htmlParseStartTag: misplaced &lt;head&gt; tag in Entity
    		libxml_use_internal_errors(true);
     
    	$doc = new DOMDocument();
    	$doc->loadHTML($response);
    	$token = $doc->getElementById("signin__csrf_token")->attributes->getNamedItem("value")->value;
     
    	echo $token;
     
    	$data = "signin[username]=$username&signin[password]=$password&signin[_csrf_token]=$token";
    	//$data = "signin[username]=$username&signin[password]=$password";
     
     
    	// LOGING + Récupération de la page souhaitée.
    	//login form action url
    	$url=$url_log; 
    	//$postinfo = "email=".$username."&password=".$password;
    	$postinfo = $data;
     
    	$cookie_file_path = $path;
     
    	$ch = curl_init();
    	curl_setopt($ch, CURLOPT_HEADER, false);
    	curl_setopt($ch, CURLOPT_NOBODY, false);
    	curl_setopt($ch, CURLOPT_URL, $url);
    	curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
     
    	curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path);
    	//set the cookie the site has for certain features, this is optional
    	curl_setopt($ch, CURLOPT_COOKIE, "cookiename=0");
    	curl_setopt($ch, CURLOPT_USERAGENT,
    		"Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7");
    	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    	curl_setopt($ch, CURLOPT_REFERER, $_SERVER['REQUEST_URI']);
    	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);
     
    	curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    	curl_setopt($ch, CURLOPT_POST, 1);
    	curl_setopt($ch, CURLOPT_POSTFIELDS, $postinfo);
    	curl_exec($ch);
     
    	//page with the content I want to grab
    	curl_setopt($ch, CURLOPT_URL, $url_wanted);
    	//do stuff with the info with DomDocument() etc
    	$html = curl_exec($ch);
    	curl_close($ch);
     
    	echo $html;

Discussions similaires

  1. [XPath]Exprimer un "otherwise" avec Xpath?!!
    Par LeNouv_O dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 27/06/2006, 10h39
  2. Problème de quote avec XPath
    Par fadjerx dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 23/03/2006, 14h45
  3. [XPATH]Acces a un champ precis avec XPath
    Par Le-Cortex dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 13/12/2005, 13h36
  4. [XSL-fo] Probleme avec XPATH
    Par serwol dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 17/06/2005, 09h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo