[CURL] identification sur un site

Eléphant du PHP | 89 Messages

05 août 2010, 18:11

Bonjour
J'ai suivi le tutoriel de Jilp sur l'utilisation de la librairie Curl http://julp.developpez.com/php/curl/#L3.1.4 et je doit avouer que je n'arrive pas à m'identifier sur un site.
J'utilise wamp, Curl est activé, et j'utilise PHP 5.3
Voici le code que j'utilise:
<?php
define('LOGIN', 'xxx);
define('PASSWORD', 'xxx');
define('AUTHENTIFICATION', 'http://forum.wawa-mania.ws/login.php');
define('PAGE_PRIVEE', 'http://forum.wawa-mania.ws/viewtopic.php?id=522363');

$sid = '';

$ch = curl_init(AUTHENTIFICATION);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS,
    array(
        'username'     => LOGIN,
        'password'     => PASSWORD
    )
);
curl_setopt($ch, CURLOPT_COOKIEJAR, realpath('cookie.txt'));
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_COOKIESESSION,  TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$ret = curl_exec($ch);
if ($ret === FALSE) {
    die(curl_error());
}
curl_close($ch);
if (preg_match('/(PHPSESSID=[0-9a-z,-]{32,40})/i', $ret, $m)) {
    $sid = '?' . $m[1];
} else if (preg_match('#<input\s+type="hidden"\s+name="([^\r\n\t <>\'"\\\]+)"\s+value="([0-9a-z,-]{32,40})"\s*/?>#i', $ret, $m)) {
    $sid = '?' . $m[1] . '=' . $m[2];
}
$ch = curl_init(PAGE_PRIVEE . $sid);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_COOKIEFILE, realpath('cookie.txt'));
$ret = curl_exec($ch);
if ($ret === FALSE) {
    die(curl_error());
}
curl_close($ch);
echo $ret;

?>

Les champs 'username' et 'password' du site sont correct.
J'ai une page blache qui s'affiche et lorsque je regarde si le fichier cookie.txt est remplie, il est vide.
Grâce au petit plug-in de firefow qui sert a voir les entêtes HTTP, j'ai constaté que le script arrive à se connecter, mais aucun cookie.
  • http://localhost/wawamania%20auto/conne ... ession.php

    GET /wawamania%20auto/connect_with_session.php HTTP/1.1
    Host: localhost
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
    Accept-Encoding: gzip,deflate
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Keep-Alive: 115
    Connection: keep-alive
    Cache-Control: max-age=0

    HTTP/1.1 200 OK
    Date: Thu, 05 Aug 2010 16:02:57 GMT
    Server: Apache/2.2.11 (Win32) PHP/5.3.0
    X-Powered-By: PHP/5.3.0
    Content-Length: 4
    Keep-Alive: timeout=5, max=100
    Connection: Keep-Alive
    Content-Type: text/html
    ----------------------------------------------------------
Pouvez vous m'aider svp?

Eléphant du PHP | 89 Messages

06 août 2010, 01:22

Bonsoir

J'ai réussi à écrire les sessions id dans un fichier texte, mais par contre je n'arrive pas à afficher la page privé.
Ce que j'ai du mal à comprendre c'est que même lorsque je rentre des mots de passes erroné dans mon script, il arrive à m'écrire quand même des sessions id sur le fichier cookie.txt
Comment être sur que le client virtuel s'est bien authentifié sur le site?
Cordialement
  • .amazon.fr TRUE / FALSE 1X81650XXX session-id-time 128XX50XX00l
    .amazon.fr TRUE / FALSE 1X81650XXX session-id 280-7704XX1-XX4730

ViPHP
ViPHP | 5462 Messages

06 août 2010, 02:26

faut pas fermer ta session curl, tout doit ce faire sur la même :wink:

Eléphant du PHP | 89 Messages

06 août 2010, 11:49

Salut
J'ai enlever le
<? php  curl_close($ch); ?> 
mais c'est pas gagner voici le code entier.
Il me redirige vers la page voulu mais par en revanche je ne suis pas authentifié.
<?php

define('LOGIN',    'xxxxx');
define('PASSWORD', 'xxxxxx');
define('AUTHENTIFICATION', 'http://forum.downparadise.ws/index.php'); 
define('PAGE_PRIVEE', 'http://forum.downparadise.ws/ucp.php');

$sid = '';


$ch = curl_init(AUTHENTIFICATION);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS,
    array(
      
        'username' =>  LOGIN,
        'password' =>  PASSWORD 
     
     )
);                                             

curl_setopt($ch, CURLOPT_COOKIEJAR, realpath('cooki12.txt'));
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_COOKIESESSION,  TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, FALSE);
$ret = curl_exec($ch);
if ($ret === FALSE) {
    die(curl_error($ch));
}
//curl_close($ch);
if (preg_match('/(PHPSESSID=[0-9a-z,-]{32,40})/i', $ret, $m)) {
    $sid = '?' . $m[1];
} else if (preg_match('#<input\s+type="hidden"\s+name="([^\r\n\t <>\'"\\\]+)"\s+value="([0-9a-z,-]{32,40})"\s*/?>#i', $ret, $m)) {
    $sid = '?' . $m[1] . '=' . $m[2];
}



$ch = curl_init(PAGE_PRIVEE . $sid);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_COOKIEFILE, realpath('cooki12.txt'));
$ret = curl_exec($ch);
if ($ret === FALSE) {
    die(curl_error($ch));
}
curl_close($ch);
echo $ret;

?>

ViPHP
ViPHP | 5462 Messages

06 août 2010, 15:09

ta pas besion de faire un curl pour récupérer le sid (pour parser du DOM c'est DOMDocument), la page attend tout les paramètre en entrer login, password, sid et même le submit, ensuite lorsque tu te connecte la page fait une redirection vers une autre page, c'est a ce moment la qu'il faut ouvrir le 2eme curl
define('LOGIN',    '');
define('PASSWORD', '');
define('AUTHENTIFICATION', 'http://forum.downparadise.ws/ucp.php?mode=login');
define('PAGE_PRIVEE', 'http://forum.downparadise.ws');

libxml_use_internal_errors(true);

$doc = new DOMDocument();
$doc->loadHTMLFile(AUTHENTIFICATION);

$xpath 	= new DOMXPath($doc);
$sid 	= $xpath->query('//input[@name="sid"]/@value')->item(0)->value;

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, AUTHENTIFICATION);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS,
    array(
     
        'username' =>  LOGIN,
        'password' =>  PASSWORD,
    	'sid'	   => $sid,
    	'login'	   => 'Connexion',    	
     )
);                                            

curl_setopt($ch, CURLOPT_COOKIEJAR, realpath('cooki12.txt'));
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_COOKIESESSION,  true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);

curl_setopt($ch, CURLOPT_URL, PAGE_PRIVEE);
$ret = curl_exec($ch);
echo $ret

ViPHP
ViPHP | 4039 Messages

06 août 2010, 15:15

Ah, ça parle de [CURL].. moi qui pensais découvrir un sujet hors du commun :twisted:
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Eléphant du PHP | 89 Messages

06 août 2010, 20:45

Salut Stealth.
J'ai lancé le fichier en local, j'ai un message d'erreur:
Warning: DOMDocument::loadHTMLFile(http://forum.downparadise.ws/ucp.php?mode=login) [domdocument.loadhtmlfile]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in E:\wamp2\www\essaye php\connect wawa.php on line 10

Notice: Trying to get property of non-object in E:\wamp2\www\essaye php\connect wawa.php on line 13


Au passage j'ai ajouter le ';' qui manquait apres le echo ;)
Cordialement

Le site est en maintenance je crois.... je vais essayer sur un autre :D
Oui comme je disais plus haut il y a cette erreur:
Notice: Trying to get property of non-object in E:\wamp2\www\essaye php\connect wawa.php on line 13

ViPHP
ViPHP | 5462 Messages

06 août 2010, 22:10

Salut Stealth.
J'ai lancé le fichier en local, j'ai un message d'erreur:
Warning: DOMDocument::loadHTMLFile(http://forum.downparadise.ws/ucp.php?mode=login) [domdocument.loadhtmlfile]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in E:\wamp2\www\essaye php\connect wawa.php on line 10

Notice: Trying to get property of non-object in E:\wamp2\www\essaye php\connect wawa.php on line 13


Au passage j'ai ajouter le ';' qui manquait apres le echo ;)
Cordialement

Le site est en maintenance je crois.... je vais essayer sur un autre :D
Oui comme je disais plus haut il y a cette erreur:
Notice: Trying to get property of non-object in E:\wamp2\www\essaye php\connect wawa.php on line 13

l'erreur ligne 13 viens que le DOMDocument ne pas bon , c'est normale puisque la page ne marche pas,
pour le ; apres le echo, c'est pas obligatoire quand c'est la fin du script :wink:

Eléphant du PHP | 89 Messages

06 août 2010, 22:39

Oh ca marche, je suis très content grâce a toi bien sur :D
Cependant je voudrais avoir des explications si cela ne te dérange pas?
Pourquoi avoir utilisé le DOM?
Cordialement

ViPHP
ViPHP | 5462 Messages

06 août 2010, 23:21

Oh ca marche, je suis très content grâce a toi bien sur :D
Cependant je voudrais avoir des explications si cela ne te dérange pas?
Pourquoi avoir utilisé le DOM?
Cordialement
il fallait récupérer le sid qui était dans le formulaire, ce que tu faisais avec curl + regexp, autant utilise DOM c'est la pour ca, c'est comme dévissr une vis avec un couteau, autant utilisé un tourne vis :wink:

Eléphant du PHP | 89 Messages

06 août 2010, 23:45

eheh j'ai appris tellement de chose grâce a toi, comme par exemple qu'on est pas obligé de mettre le ; a la fin du script ou encore le dom 8-)
Je veux être sur que j'ai bien compris les étapes je récapitule:
donc le client virtuel se connecte au servseur distant, si il arrive a se logger, une session est crée sur le serveur puis elle est transmise au client virtuel (chez moi loclahost)?
Donc si c'est un client normal qui se connecte au serveur, le sid est stocké coté client sous forme de cookie ou pas?
cordialement

ViPHP
ViPHP | 5462 Messages

06 août 2010, 23:50

si c'est un client normale oui, par contre ca va etre plus compliquer si tu veux que différente personne se log grâce a ta page, il va faaloir faire un cookie unique coté serveur

Eléphant du PHP | 89 Messages

07 août 2010, 00:25

Heu okay mais peux tu me dire un peu plus sur
$sid  = $xpath->query('//input[@name="sid"]/@value')->item(0)->value;
PS: ah oui d'accord ta regardé le code source de la page?
<td class="cat" colspan="2" align="center"><input type="hidden" name="sid" value="df946c6dbb9266e45b2a60977fc29d92" />
<input type="hidden" name="redirect" value="index.php" />
<input type="submit" name="login" class="btnmain" value="Connexion" tabindex="5" /></td>
</tr>
</table>
Ok donc tu récupere le sid qui est je rappelle en type hidden, tu l'envoi avec le login + mdp +Connexion en post.
Puis si c'est bon le serveur m'envoi la session et que je le stock dans cooki12.txt?
Puis je peux accéder a ma page privé grace à la session qui été enregistré dans le cook12?
Cordialement

ViPHP
ViPHP | 5462 Messages

07 août 2010, 00:35

voila, c'est plus ou moins ce que t'avais fais au départ :wink:

par contre on dois reeouvrir la page, puisque le 1er curl fais une redirection en javascript, pour le 1er curl_exec, j'ai pas mis d'echo
curl_exec($ch);

curl_setopt($ch, CURLOPT_URL, PAGE_PRIVEE);
$ret = curl_exec($ch);
echo $ret

Eléphant du PHP | 89 Messages

07 août 2010, 01:16

Okay je vaist'embêter u peu mon ami, mais je vais essayer sur un autre site qui s'appelle http://forum.wawa-mania.ws/index.php.
Voici le code source de la page,
<form id="login" method="post" action="login.php?action=in" onsubmit="return process_form(this)">
<div class="inform">
<fieldset>
<legend>Saisissez ci-dessous votre nom d'utilisateur et votre mot de passe</legend>
<div class="infldset">
						<input type="hidden" name="form_sent" value="1" />
						<input type="hidden" name="redirect_url" value="index.php" />

<label class="conl"><strong>Nom d'utilisateur</strong><br />
                                                                                               <input type="text" name="req_username" size="25" maxlength="25" tabindex="1" /><br />
</label><label class="conl"><strong>Mot de passe</strong><br />
                                                                                                <input type="password" name="req_password" size="16" maxlength="16" tabindex="2" /><br /></label>
<p class="clearb">Si vous avez oublié votre mot de passe, veuillez cliquer ci-dessous sur le lien approprié.</p>
 <p><a href="register.php" tabindex="4"></a>&nbsp;&nbsp;
<a href="login.php?action=forget" tabindex="5">Mot de passe oublié&nbsp;?</a></p>
<p class="clearb">
<br />
<span style="color: #257104; font-size: 15px;">Bienvenue sur Wawa-Mania, si c'est votre première visite, merci de cliquer sur ce lien <a href="http://forum.wawa-mania.ws/register.php">inscription</a></span><br /></p></div>
</fieldset>
</div>
<p>
                                                                                                          <input type="submit" name="login" value="S'identifier" tabindex="3" /></p>
</form>

Dance cas je n'ai pas besoin d'analyer les input avec Dom, puiqu'il ne sont pas généré dynamiquement?
J'ai fait comme ceci:
<?php
define('LOGIN',    'xxx');
define('PASSWORD', 'xxx'); 
define('AUTHENTIFICATION', 'http://forum.wawa-mania.ws/login.php?action=in');
define('PAGE_PRIVEE', 'http://forum.wawa-mania.ws/profile.php?section=personality&id=621507');

libxml_use_internal_errors(true);

//$doc = new DOMDocument();
//$doc->loadHTMLFile(AUTHENTIFICATION);

//$xpath  = new DOMXPath($doc);
//$sid    = $xpath->query('//input[@name="sid"]/@value')->item(0)->value;

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, AUTHENTIFICATION);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS,
    array(
     
        'req_username'     =>  LOGIN,
        'req_password'     =>  PASSWORD,
        'form_sent'        => 1,
        'redirect_url'     => 'index.php',
        'login'            => 'S\'identifier',   
     )
);                                            

curl_setopt($ch, CURLOPT_COOKIEJAR, realpath('cooki12.txt'));
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_COOKIESESSION,  true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);

curl_setopt($ch, CURLOPT_URL, PAGE_PRIVEE);
$ret = curl_exec($ch);
echo $ret

?>
A ton avis c'est correct
Edit: Page blache ralal