Curl PHP VS connection triple création de cookies

Petit nouveau ! | 4 Messages

26 oct. 2015, 16:49

Bonjour,

Je rencontre un problème dans l'utilisation de curl et la méthode POST.

En effet, si je rentre l'url suivante dans ma barre d'addresse : "Monsite/Mapage?MonUser=Moi&MonPassword=Monpasse&action=connection", cela fonctionne (3 cookies sont créés ce qui me permet d'être connecté sur un intranet).

Lorsque je tente de réaliser la même chose via curl:
$ch = curl_init();
	
	curl_setopt_array($ch, array( 
	     
         CURLOPT_URL => "Monsite/Mapage?MonUser=Moi&MonPassword=Monpasse&action=connection",
	
        CURLOPT_TIMEOUT => 4,
		CURLOPT_SSL_VERIFYPEER => false,
		CURLOPT_FOLLOWLOCATION => true,
		CURLOPT_COOKIESESSION => true,
		CURLOPT_COOKIEJAR => "mycookie.txt",
		CURLOPT_COOKIEFILE => "mycookie.txt",
		
        CURLOPT_POST => 1,
        CURLOPT_FRESH_CONNECT => 0,
        CURLOPT_FORBID_REUSE => 0, 
        // CURLOPT_POSTFIELDS => urldecode( http_build_query( array(
			Mes variables
		// ) ) )
	)); 

	
$result=curl_exec($ch);
 echo $result ; exit();
Cela ne passe pas, seul 2 des 3 cookies nécessaires sont créés. Il semble (d'après l'outil dev de chrome) que cela envoie un get malgré l'emploi de "CURLOPT_POST => 1,".

Quelqu'un aurait il une idée pour sauver mes cheveux?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9783 Messages

26 oct. 2015, 19:03

C'est ton serveur PHP qui envoie la requête POST, pas ton navigateur donc l'outil développeur de Chrome ne te sera d'aucune aide, il indique seulement le GET que tu fais pour exécuter ton script PHP dans la navigateur.

Pour voir les requêtes, tu peux utiliser wireshark qui va te permettre de voir et analyser les trames réseaux.
Après pour ton problème, difficile à dire, peut être qu'il y a une analyse de l'user-agent et donc qu'il faut que tu fasse attention à répliquer également l'user-agent.
Peut être que ce 3ème cookie n'est pas créé par le serveur via les entetes HTTP mais via javascript dans le code HTML...
Quand tout le reste a échoué, lisez le mode d'emploi...

Petit nouveau ! | 4 Messages

27 oct. 2015, 11:34

Bonjour,
En fait, je ne crois pas que cela vienne du useragent, et je crois avoir compris mon problème.
Le fonctionnement est le suivant:
=> J'envoi user et mdp à la page 1, celle-ci est censée créé le cookie .net puis redirige vers la page 2.
=> la page 2 créé le cookie .com puis redirige vers la page 3.
=> la page 3 créé le cookie .fr puis redirige sur la page initiale. Si les trois conquis sont présent alors c'est bon, en avant vers l'intranet.

En regardant de plus pret ce que fait curl lors de l'appel à la page 1, il semble il y avoir un léger problème.
En éffet si j'affiche cette page voilà ce que cela donne:

Code : Tout sélectionner

HTTP/1.1 200 OK Date: Tue, 27 Oct 2015 09:17:37 GMT Server: Apache Set-Cookie: WS_UsrRef=Moi quoi; path=/; domain=.Monsite.net; Set-Cookie: WS_UsrLng=FR; path=/; domain=.Monsite.net; Set-Cookie: WS_UsrSid=Unnuméro; path=/; domain=.Monsite.net; Set-Cookie: WS_LastUid=Cétaitdéjàmoibizarrejesais; path=/; domain=.Monsite.net; Expires=Thu, 31 Dec 2037 23:59:59 GMT; Set-Cookie: WS_UsrAut=Unesuperclefdelamortquitue; path=/; domain=.monsite.net; Transfer-Encoding: chunked Content-Type: text/html <html> <header> ... Contenu normal d'une page html quoi </html>
Les lignes de création du cookie sont généré en javascript.
Je subodore que les 3 premières lignes gènent? De plus, même si je ne suis pas un spécialiste, je suppose que les ligne set-cookie doivent se situer quelque part a l'intérieur des balises html?
Je suppose que je suis donc censé scrapé et réorganisé le tout avant affichage?

Espérant qu'on pourra y arriver :)

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9783 Messages

27 oct. 2015, 11:48

Je subodore que les 3 premières lignes gènent? De plus, même si je ne suis pas un spécialiste, je suppose que les ligne set-cookie doivent se situer quelque part a l'intérieur des balises html?
Je suppose que je suis donc censé scrapé et réorganisé le tout avant affichage?
En fait, la réponse d'un serveur à une requête web est constituée de 2 parties :
- l'entête HTTP, qui fournit des infos sur la nature du contenu et des données techniques (notamment sur les cookies)
- le corps du document.

Dans ton exemple tu as demandé l'affichage des 2, c'est pour cela que tu vois les entêtes avant le HTML.
Pour débuguer des cookies, je te recommande de conserver l'affichage des headers.

Les lignes de création du cookie sont généré en javascript.
Tu es sûr de ça ?
Si c'est effectivement du javascrip qui crée les cookies, alors il faut effectivement que tu le regénères de ton côté car curl n'interprète pas le javascript.

Mais vu l'entête retournée par ton serveur avec les Set-cookie, je ne suis pas sur que ce javascript intevienne, ou alors peut être pour le 3ème cookie (celui qui ne se crée pas)
Quand tout le reste a échoué, lisez le mode d'emploi...

Petit nouveau ! | 4 Messages

27 oct. 2015, 15:51

Oui je suis sûr pour le javascript voici le lancement depuis la page du login:

Code : Tout sélectionner

<a class="button" href="javascript:SubmitForm(document.FORM1,'go');" alt="Authentification avec mot de passe" title="Authentification avec mot de passe"> <span>OK</span> </a>
La fonction SubmitForm

Code : Tout sélectionner

function SubmitForm (Form, data) { if (CTRL (Form, data)) { Form.action = "https://Monsite:443/cgi/wway_authent?TdsName=PILX" ; Form.Action.value = data ; Form.submit () ; } }
La fonction CTRL

Code : Tout sélectionner

function CTRL (Form, action) { if (isNull (Form.user)) { alert (msg_1) ; return false ; } if (action == 'chgpsw') { if (isNull (Form.cookie)) { alert (msg_2) ; return false ; } } if (action == 'searchid') // fonction desactivee { if (Form.user.value.indexOf ('.') != -1) { alert (msg_3) ; return false ; } } return true ; }
Par contre n'étant pas un spécialiste du javascript, il envoit quoi exactement le javascript?
J'aurai tendance à dire https://Monsite:443/cgi/wway_authent?Td ... &Action=go
Sauf que j'ai l'impession qu'il envoie aussi toute les données du formulaire Form1?
Soit:

Code : Tout sélectionner

<form name=FORM1 action="something" method="post" accept-charset="ISO-8851-1, Windows-1252, UTF-8"> <input type="hidden" name="Internet" value="0"> <input type="hidden" name="WebAgt" value="0"> <input type="hidden" name="UrlConnect" value=""> <input type="hidden" name="Service" value=""> <input type="hidden" name="Action" value="go"> <input type="hidden" name="lng" value="FR"> <input type="hidden" name="stdport" value="80"> <input type="hidden" name="sslport" value="443"> + <input class="B_rubrique_input" title="Saisir votre identifiant court (ex: dupont-ch) ou long (ex: charles-henry.dupond)" size="24" name="user" > <input class="B_rubrique_input" type=password size="24" autocomplete="off" name="cookie" >
Et voici le passage parlant des cookie dans la page qui réceptionne:

Code : Tout sélectionner

/* ========================================================================== */ /* = = */ /* = Cookies = */ /* = = */ /* ========================================================================== */ //SetCookie( name, value, expires, path, domain, secure ) function SetCookie (name, value) { var argv=SetCookie.arguments; var argc=SetCookie.arguments.length; var expires=(argc > 2) ? argv[2] : null; var path=(argc > 3) ? argv[3] : null; var domain=(argc > 4) ? argv[4] : null; var secure=(argc > 5) ? argv[5] : false; document.cookie=name+"="+escape(value)+ ((expires==null) ? "" : ("; expires="+expires.toGMTString()))+ ((path==null) ? "" : ("; path="+path))+ ((domain==null) ? "" : ("; domain="+domain))+ ((secure==true) ? "; secure" : ""); }

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9783 Messages

27 oct. 2015, 19:56

Est-ce que tu vois un appel à la fonction SetCookie() quelque part en javascript ?
Car dans le code que tu as posté, je n'en vois pas.
Quand tout le reste a échoué, lisez le mode d'emploi...

Petit nouveau ! | 4 Messages

28 oct. 2015, 12:53

Code : Tout sélectionner

function loadConfFromQuerystring () { //Forcer les cookies si passage de paramètres var confLoaded = false; var today = new Date(); var expire = new Date(); expire.setTime(today.getTime() + 3600000*24*365); // une année var domaine = Extraitdomaine(document.domain); var query1 = QueryString("DragContainer1"); var query2 = QueryString("DragContainer2"); var query3 = QueryString("NextDomains"); for (var i=0;i<QueryString.keys.length;i++) { var key=QueryString.keys[i]; var nbval=QueryString.values[i]?QueryString.values[i].length:0; if (key=="DragContainer1") { if (nbval==0){ DeleteCookie('DragContainer1','/',domaine); } else { SetCookie ('DragContainer1', query1, expire, '/', domaine); confLoaded = true; } } if (key=="DragContainer2") { if (nbval==0){ DeleteCookie('DragContainer2','/',domaine); } else { SetCookie ('DragContainer2', query2, expire, '/', domaine); confLoaded = true; } } if (key=="NextDomains") { nextDomains=""; if (nbval==0){ //alert('Sauvegarde terminée'); ; } else { //Extraire prochain domaine if (query3.indexOf(",",0)>0) { currentDomain=query3.substring(0,query3.indexOf(",",0)); nextDomains=query3.substring(query3.indexOf(",",0)+1,query3.length); } else { currentDomain=query3; } currentDomain="Monsite."+currentDomain; domaine = Extraitdomaine(document.domain); //Tant que nextDomain n'est pas vide on s'appelle sur le domaine specifié //Changement du domaine dans configUrl newConfigUrl = configUrl.substring(0,configUrl.indexOf(domaine,0)) + currentDomain + ":443/cgi/wway_authent?TdsName=PILX&Internet=0&DragContainer1="+query1+"&DragContainer2="+query2 + "&NextDomains=" + nextDomains; //configUrl.substring(configUrl.indexOf(domaine,0)+domaine.length) + "&NextDomains=" + nextDomains; document.location.href=newConfigUrl; } } } //On force le rechargement s'il y a eu passage de paramètres //if (confLoaded) // document.location.href=Monsite_auth; }
Voici l'appel de la fonction ... dans une autre fonction elle-même appelée dans une autre fonction etc...
En tout la page d'arrivé contient pas loin de 1500 lignes de javascript... Je crois donc pouvoir affirmer que les cookies sont bien créés par ce biais...

Selon moi, c'est pour cette raison que le premier cookie n'est pas créé alors que les deux suivants (issus) de redirections successives le sont...

Du coup peut on extraire les informations du header pour créer le premier cookie manuellement avant affichage?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9783 Messages

28 oct. 2015, 13:06

Si il est créé via javascript, les infos du cookies ne seront pas visible en header.
il faut que tu analyses comment il est créé et que tu le crées manuellement dans ton fichier mycookie.txt par exemple
Quand tout le reste a échoué, lisez le mode d'emploi...