Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks
Bibliothèques et frameworks Forum d'entraide sur les frameworks, templates, bibliothèques de code (PDFLib, eZPdf, JpGraph, Artichow, PEAR, etc). Avant de poster : FAQ bibliothèques, toutes les FAQ PHP et cours bibliothèques
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/12/2007, 04h00   #1
Invité de passage
 
Inscription : décembre 2007
Messages : 4
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 4
Points : 0
Points : 0
Par défaut [cURL] Simuler Javascript (document.cookies) avec cURL

Bonjour,

J'ai un petit problème avec cURL. Voici mon cheminement...

#1
Je dois me connecter sur un site SSL avec un formulaire (login.fcc) qui envoie mon code d'usager / mot de passe. La page me retourne du Javascript qui redirige vers une autre page. Jusque là, tout fonctionne.

Résultat lors du succès:
Code :
1
2
3
4
<script language="javascript">
  ...
  document.location.href = site + "success.jsp?DEST=" + target;
</script>
#2
J'appelle donc la page success.jsp.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
$url= "https://.../login/success.jsp?DEST=http://.../redirect.html";
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_POST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, './cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, './cookie.txt');
$xxx = curl_exec($ch);
La page me retourne ceci :

Code :
1
2
3
4
<script language="Javascript">
document.cookie = 'HOSTDESTINATION=; expires=' + 'Mon, 01-Jan-90 00:00:01 GMT' +'; path=/; domain=.domain.com';
window.location= 'http://...';
</script>
Là est mon problème. Je ne suis pas capable de me rendre à la page 'http://...'. J'ai tenté de simuler le cookie du Javascript mais sans succès.

Code :
1
2
3
4
$url="http://...";
curl_setopt($ch, CURLOPT_URL, $url);  
curl_setopt($ch, CURLOPT_COOKIE, 'HOSTDESTINATION=; expires=' + 'Mon, 01-Jan-90 00:00:01 GMT; path=/; domain=.domain.com');
$xxx = curl_exec($ch);
Est-ce que quelqu'un pourrait me diriger vers la solution ?

En passant, j'utilise la même connection $ch tout au long du script. J'ai mon appel à $ch = curl_init(); en début du script et curl_close ($ch); à la fin.

Merci d'avance !
bono2007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2007, 11h22   #2
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
C'est plus simple puisque le client n'émet pas les informations date d'expiration, domaine, chemin, ... puisqu'elles lui sont destinées :
Citation:
CURLOPT_COOKIE

Pass a pointer to a zero terminated string as parameter. It will be used to set a cookie in the http request. The format of the string should be NAME=CONTENTS, where NAME is the cookie name and CONTENTS is what the cookie should contain.

If you need to set multiple cookies, you need to set them all using a single option and thus you need to concatenate them all in one single string. Set multiple cookies in one string like this: "name1=content1; name2=content2;" etc.

Using this option multiple times will only make the latest string override the previous ones.
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2007, 17h19   #3
Invité de passage
 
Inscription : décembre 2007
Messages : 4
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 4
Points : 0
Points : 0
Je ne suis pas sur de comprendre. Je comprend que le cookie est destiné pour le client mais en code ça se traduit comment ?

J'ai essayé :

Code :
1
2
3
4
curl_setopt($ch, CURLOPT_URL, $url);  
curl_setopt($ch, CURLOPT_COOKIE, 'HOSTDESTINATION=TEST');
$xxx = curl_exec($ch);
echo $xxx;
mais j'obtiens :

Citation:
> GET /redirect.html HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: <*************>
Accept: */*
Cookie: JSESSIONID=0000UwQgLtK01aVv_7u-iU7PeP-:11hkdpi0q; HOSTDESTINATION=TEST

< HTTP/1.1 302 Moved Temporarily
< Server: Netscape-Enterprise/6.0
< Date: Thu, 06 Dec 2007 16:12:34 GMT
< Cache-Control: no-cache
???

Merci pour ton aide ...
bono2007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2007, 19h35   #4
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Citation:
Envoyé par bono2007
En passant, j'utilise la même connection $ch tout au long du script. J'ai mon appel à $ch = curl_init(); en début du script et curl_close ($ch); à la fin.
Je ne suis pas certain que ce soit une bonne idée car je pense que les options sont ainsi conservées d'une connexion à l'autre.

Citation:
Envoyé par bono2007
Je ne suis pas sur de comprendre. Je comprend que le cookie est destiné pour le client mais en code ça se traduit comment ?
ça me paraît correct. Le plus simple et sage est de tester à l'aide d'un script contenant au moins :
Code :
1
2
3
<?php
header('Content-type: text/plain');
print_r($_COOKIE);
Puis de l'appeler par un autre via cURL

Citation:
Envoyé par bono2007
J'ai essayé :
[...]
mais j'obtiens :
Citation:
< HTTP/1.1 302 Moved Temporarily
Ne devez-vous pas suivre la redirection ici ? (CURLOPT_FOLLOWLOCATION à une valeur vraie)
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2007, 21h04   #5
Invité de passage
 
Inscription : décembre 2007
Messages : 4
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 4
Points : 0
Points : 0
Citation:
Envoyé par julp Voir le message
Je ne suis pas certain que ce soit une bonne idée car je pense que les options sont ainsi conservées d'une connexion à l'autre.¸
j'ai essayé en fermant mes sessions à chaque fois et pour l'instant je n'ai pas de problème. Effectivement, les options sont concervés à chaque curl_exec quand on utilise pas curl_close à chaque fois.


Citation:
Envoyé par julp Voir le message
ça me paraît correct. Le plus simple et sage est de tester à l'aide d'un script contenant au moins :
Code :
1
2
3
<?php
header('Content-type: text/plain');
print_r($_COOKIE);
Puis de l'appeler par un autre via cURL
J'ai essayé le code ci-dessus avec une page de test.php:
Code :
1
2
3
4
5
6
7
8
9
10
11
$url= "https://localhost/test/test.php";
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url);  
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 
curl_setopt($ch, CURLOPT_COOKIE, 'HOSTDESTINATION=; expires=; path=/; domain=.domain.com');
$result = curl_exec($ch);
echo $result;
curl_close ($ch);
Résultat de test.php :
Code :
1
2
3
4
5
6
7
Array
(
    [HOSTDESTINATION] => 
    [expires] => 
    [path] => /
    [domain] => .domain.com
)

Citation:
Envoyé par julp Voir le message
Ne devez-vous pas suivre la redirection ici ? (CURLOPT_FOLLOWLOCATION à une valeur vraie)
J'ai aussi essayé... La redirection fonctionne. Cependant, je ne peux accéder à la page http://... du code ci-bas, donc la redirection se fait sur la page de login https://.../login/login.fcc comme si je n'étais plus connecté.

Code :
1
2
3
4
<script language="Javascript">
document.cookie = 'HOSTDESTINATION=; expires=' + 'Mon, 01-Jan-90 00:00:01 GMT' +'; path=/; domain=.domain.com';
window.location= 'http://...';
</script>
Au départ, je croyais que c'était un problème avec le cookie du javascript, mais avec le test que je viens de faire le problème semble être ailleur. La page valide surement autre chose (session, etc...) sauf que je n'ai aucune idée de quoi ça pourrait être.

Avez-vous déjà vu ce genre de problème ?

Merci encore !
bono2007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2007, 22h50   #6
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Je peux vous donner plusieurs "pistes" :

Citation:
Envoyé par bono2007
j'ai essayé en fermant mes sessions à chaque fois et pour l'instant je n'ai pas de problème. Effectivement, les options sont concervés à chaque curl_exec quand on utilise pas curl_close à chaque fois.
Ce n'est pas mentionné dans la documentation mais il est possible que les options COOKIEFILE et COOKIE ne fassent pas bon ménage. D'autant plus que si l'option COOKIE est utilisée plusieurs fois, seul le dernier appel est pris en compte.

Citation:
Envoyé par bono2007
Résultat de test.php :
Code :
1
2
3
4
5
6
7
Array
(
    [HOSTDESTINATION] => 
    [expires] => 
    [path] => /
    [domain] => .domain.com
)
Résultat correct, mais comme je l'indiquais vous n'avez pas à envoyer les informations expires, path et domain puisqu'elles vous sont destinées

Citation:
Envoyé par bono2007
J'ai aussi essayé... La redirection fonctionne. Cependant, je ne peux accéder à la page http://... du code ci-bas, donc la redirection se fait sur la page de login https://.../login/login.fcc comme si je n'étais plus connecté.
Le serveur peut indiquer que le cookie n'est valable que s'il est associé au protocole HTTPS (paramètre secure - si le client la respecte).

Citation:
Envoyé par bono2007
Au départ, je croyais que c'était un problème avec le cookie du javascript, mais avec le test que je viens de faire le problème semble être ailleur. La page valide surement autre chose (session, etc...) sauf que je n'ai aucune idée de quoi ça pourrait être.
C'est l'identifiant de session que vous devez réemettre (JSESSIONID) mais il n'apparaît pas dans ce que vous citez. Figure-t-il dans votre fichier cookie.txt ? Vous devriez également vérifier, suivant les options que vous utilisez, que les options COOKIEFILE et COOKIEJAR utilise bien le fichier indiqué (cf discussion : [cURL] Non prise en compte des cookies avec librairie curl).
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2007, 03h48   #7
Invité de passage
 
Inscription : décembre 2007
Messages : 4
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 4
Points : 0
Points : 0
Je suis pas mal découragé...

J'ai essayé pleins de choses et ça ne fonctionne toujours pas.

Peu importe ce que je tente, le dernier appel me renvoie toujours à la page de login.

Le site dont je veux me connecter semble être plutôt bien "protégé" .

Je reprend depuis le début. Mon besoin en faite est de me connecter sur un site pour obtenir de l'information sur certain produit dont il vend...

Voici donc mon code en premier lieu et mon fichier de résultat. J'ai remplacé le nom du host par HOST et l'adresse IP de ce dernier par IP_HOST ...

3 appels:
1- La page d'accueil
2- Le lien du formulaire (POST)
3- La page où se trouve l'information dont j'ai besoin (qui me dirige en faite sur la page d'accueil comme si je n'étais pas connecté)

Code:
Code :
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
 
 
$url= "http://HOST/corporate/corporate.jsp";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_POST, false);
curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIEFILE, './cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEJAR, './cookie.txt');
$result = curl_exec($ch);
echo $result;
 
$data = array('USER1' => "<mon user>", 'PASSWORD' => "<mon password>", 'DOMAIN' => "HOST", 'TARGET' => "/corporate/login/success.jsp?DEST=http://HOST/reseller/reseller_redirect.html");	
 
$url= "https://ssl.HOST/login/login.fcc";
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"); 
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, './cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, './cookie.txt');
$result= curl_exec ($ch); 
echo $result;
 
$url= "http://HOST/FT/reseller/jsp/technotes/printtechnote.jsp?Lookup=43565C";
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_POST, false);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, './cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, './cookie.txt');
$result = curl_exec($ch);
echo $result;
 
 
curl_close ($ch);

Résultat:

Code X :
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
* About to connect() to HOST port 80 (#0)
*   Trying IP_HOST... * connected
* Connected to HOST(IP_HOST) port 80 (#0)
> GET /corporate/corporate.jsp HTTP/1.1
Host: HOST
Accept: */*

< HTTP/1.1 200 OK
< Server: Netscape-Enterprise/6.0
< Date: Sat, 08 Dec 2007 02:30:54 GMT
< Content-type: text/html;charset=ISO-8859-1
< Content-language: en
* Added cookie JSESSIONID="0000WZDYQykCuTBZiALnhFCeDeD:11it7eji2" for domain HOST, path /, expire 0
< Set-cookie: JSESSIONID=0000WZDYQykCuTBZiALnhFCeDeD:11it7eji2; Path=/
< Connection: close
* Examining connection #0 for reuse
* About to connect() to ssl.HOST port 443 (#1)
*   Trying IP_HOST... * connected
* Connected to ssl.HOST (IP_HOST) port 443 (#1)
* SSL connection using RC4-MD5
* Server certificate:
* 	 subject: /C=US/ST=Texas/L=Dallas...
* 	 start date: 2007-03-23 00:00:00 GMT
* 	 expire date: 2008-03-22 23:59:59 GMT
* 	 issuer: /C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=Terms of use at https://www.verisign.com/rpa (c)05/CN=VeriSign Class 3 Secure Server CA
* SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway.
> POST /login/login.fcc HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: ssl.HOST
Accept: */*
Content-Length: 549
Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------b3dd6bbf8ba3

< HTTP/1.1 200 OK
< Server: Netscape-Enterprise/6.0
< Date: Sat, 08 Dec 2007 02:30:59 GMT
< Content-type: text/html; charset=ISO-8859-1
< Connection: close
* Examining connection #0 for reuse
* Connection #0 seems to be dead!
* Closing connection #0
* About to connect() to ca.HOST port 80 (#0)
*   Trying IP_HOST... * connected
* Connected to ca.HOST (IP_HOST) port 80 (#0)
> GET /FT/reseller/jsp/technotes/printtechnote.jsp?Lookup=43565C HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: ca.HOST
Accept: */*
Cookie: JSESSIONID=0000WZDYQykCuTBZiALnhFCeDeD:11it7eji2

< HTTP/1.1 302 Moved Temporarily
< Server: Netscape-Enterprise/6.0
< Date: Sat, 08 Dec 2007 02:30:59 GMT
< Cache-Control: no-cache
< Location: https://ssl.HOST/login/login.fcc?TYPE=33554433&REALMOID=06-00047fca-1b91-1fb5-a55a-8329bf690000&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=$SM$HFpCo%2fHcHyGKMX7wXOjbSn4lEKvJW1BCKcnmSZHxHUN47JlHmj%2bBYA%3d%3d&TARGET=$SM$http%3a%2f%2fca%2eHOST%2ecom%2fFT%2freseller%2fjsp%2ftechnotes%2fprinttechnote%2ejsp%3fLookup%3d43565C
< Connection: close
* Issue another request to this URL: 'https://ssl.HOST/login/login.fcc?TYPE=33554433&REALMOID=06-00047fca-1b91-1fb5-a55a-8329bf690000&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=$SM$HFpCo%2fHcHyGKMX7wXOjbSn4lEKvJW1BCKcnmSZHxHUN47JlHmj%2bBYA%3d%3d&TARGET=$SM$http%3a%2f%2fca%2eHOST%2ecom%2fFT%2freseller%2fjsp%2ftechnotes%2fprinttechnote%2ejsp%3fLookup%3d43565C'
* Examining connection #0 for reuse
* Examining connection #1 for reuse
* Connection #1 seems to be dead!
* Closing connection #1
* About to connect() to ssl.HOST port 443 (#1)
*   Trying IP_HOST... * connected
* Connected to ssl.HOST (IP_HOST) port 443 (#1)
* SSL connection using RC4-MD5
* Server certificate:
* 	 subject: /C=US/ST=Texas/L=Dallas/O=...
* 	 start date: 2007-03-23 00:00:00 GMT
* 	 expire date: 2008-03-22 23:59:59 GMT
* 	 issuer: /C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=Terms of use at https://www.verisign.com/rpa (c)05/CN=VeriSign Class 3 Secure Server CA
* SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway.
> GET /login/login.fcc?TYPE=33554433&REALMOID=06-00047fca-1b91-1fb5-a55a-8329bf690000&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=$SM$HFpCo%2fHcHyGKMX7wXOjbSn4lEKvJW1BCKcnmSZHxHUN47JlHmj%2bBYA%3d%3d&TARGET=$SM$http%3a%2f%2fca%2eHOST%2ecom%2fFT%2freseller%2fjsp%2ftechnotes%2fprinttechnote%2ejsp%3fLookup%3d43565C HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: ssl.HOST
Accept: */*

< HTTP/1.1 200 OK
< Server: Netscape-Enterprise/6.0
< Date: Sat, 08 Dec 2007 02:31:00 GMT
< Content-type: text/html; charset=ISO-8859-1
< Connection: close
* Closing connection #0
* Closing connection #1
bono2007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h24.


 
 
 
 
Partenaires

Hébergement Web