2015-08-15 1 views
0

J'essaie de me connecter à un site Web en utilisant curl, mais je ne peux pas le faire fonctionner.
C'est le code que j'utilise.connexion avec curl php

D'abord, je reçois le jeton csrf du site Web pour m'assurer qu'il correspond.
Mais le résultat que je récupère est toujours le formulaire de connexion.

$url="http://www.example.com/accounts/login"; 
$postinfo = 'csrfmiddlewaretoken='.$key.'&[email protected]&password=mypassword'; 

$cookie = "cookies.txt"; 

$ch = curl_init(); 
curl_setopt ($ch, CURLOPT_URL, $url); 
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6"); 
curl_setopt ($ch, CURLOPT_TIMEOUT, 60); 
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt ($ch, CURLOPT_POSTFIELDS, $postinfo); 
curl_setopt ($ch, CURLOPT_COOKIEJAR, $cookie); 
curl_setopt ($ch, CURLOPT_COOKIEFILE, $cookie); 
curl_setopt ($ch, CURLOPT_POST, 1); 
$result = curl_exec($ch); 

return $result; 

Est-ce que quelqu'un sait pourquoi je ne peux pas me connecter?

Les champs de formulaire sont corrects et aussi lorsque je fais une tentative de connexion, le fichier cookies.txt a changé.

+0

Ajouter un rapport d'erreur au début de votre fichier (s) juste après l'ouverture de votre balise PHP par exemple '

+0

@ Fred-ii- Je ne vois pas d'erreur, mais juste pour vous faire savoir que j'utilise laravel 5 – Szenis

+0

Vous voudrez peut-être ajouter l'étiquette pour cela, il pourrait y avoir une certaine pertinence pour elle. Je ne peux pas dire avec certitude si cela a un rapport avec ça, puisque je ne sais rien de Laravel. –

Répondre

1

Les raisons les plus probables sont les suivantes:

  1. Vous réinitialisant boucle après que vous obtenez le jeton CRSF, il devient invalide pour la demande ultérieure, parce que ce une session complètement différente jusqu'à la site est concerné.

  2. Votre $postinfo est une chaîne, vous devez donc urlencode() les valeurs à la main (CURLOPT_POSTFIELD S accepte également des tableaux associatifs, dans ce cas, vous n'avez pas besoin de le faire).

+0

J'ai déjà essayé avec urlencode et aussi avec un tableau mais cela n'a rien changé. Cependant, je fais 2 demandes curl, cela pourrait-il être un problème? Si oui, comment puis-je obtenir le jeton csrf? – Szenis

+0

Vous devez soit 'urlencode()' le jeton, le nom d'utilisateur et le mot de passe, soit utiliser un tableau. La façon dont il est maintenant (avec '@' qui n'est clairement pas codé en pourcentage) ne volera pas. Le nombre de requête n'a pas d'importance, tant que vous n'appelez pas curl_init() entre. Et assurez-vous de définir 'COOKIEFILE' et 'COOKIEJAR' avant le premier GET afin que curl récupère les cookies de session et les envoie de nouveau avec le POST suivant. – lafor

+0

Oui c'était bien le jeton csrf. – Szenis

1

Il y a plusieurs suggestions auxquelles je peux penser. Ceux-ci sont basés sur une expérience antérieure quand cela n'a pas fonctionné pour moi et je l'ai finalement réussi à travailler par essais et erreurs.

Assurez-vous que cookies.txt est accessible en écriture. Placez cookies.txt dans un dossier séparé quelque part en dehors de votre www-root et changer la valeur de $ cookie avec le chemin absolu:

$cookie = "/path/to/writable/folder/cookies.txt"; 

Après avoir tenté de se connecter, vérifier si le fichier contient des valeurs de cookie. Si elle contient des valeurs de cookie, mais pas celles dont vous avez besoin pour être reconnues comme étant connectées, il se peut qu'il y ait des contrôles côté serveur supplémentaires pour empêcher les formulaires d'être envoyés depuis l'extérieur du serveur en plus de la vérification des jetons.

Voir ce qu'est l'URL du formulaire de connexion humain normal, par ex. http://www.example.com/accounts/loginform.html - ou l'URL que vous utilisez pour obtenir le jeton et ajouter que referer:

curl_setopt($ch, CURLOPT_REFERER, 'http://www.example.com/accounts/loginform.html'); 
curl_setopt($ch, CURLOPT_AUTOREFERER, true); 

Définir des options encore plus humaine vous faire apparaître:

curl_setopt($ch, CURLINFO_HEADER_OUT, 1); 
curl_setopt($ch, CURLOPT_ENCODING, "gzip,deflate,sdch"); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
     'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
     'Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3', 
     'Accept-Language:en-US,en;q=0.5', 
     'Origin: http://www.example.com', 
     'Cache-Control:no-cache', 
     'Connection:keep-alive', 
     'Pragma:no-cache', 
     'Expect:' 
    )); 

Le tableau d'en-tête d'exemple ci-dessus travaillé dans mon cas particulier. Dans votre cas, d'autres en-têtes peuvent être envoyés lorsqu'un utilisateur se connecte. Essayez de vous connecter une fois à l'aide d'un navigateur et, dans les outils de développement du navigateur, vérifiez les en-têtes des demandes et copiez-les. Vérifiez également ce qui est posté pour les valeurs cachées (dans mon cas, il fallait ajouter "& __VIEWSTATE = somereallylongIIScode" à la chaîne CURLOPT_POSTFIELDS).

+0

Merci pour votre aide, l'URL correcte était un peu différente alors je pensais parce que ce n'était pas '' '' '' http: // www.example.com/accounts/loginform'''' mais '' '' 'http : // www.example.com/ accounts/loginform/'' '' Je n'aurais jamais pensé que cela ferait partie du problème. – Szenis

+0

Super, heureux que vous l'avez eu à travailler .. J'avais besoin de ce qui précède pour obtenir le mien de travailler :-) –