2015-08-15 105 views
0

我正在尝试使用curl登录网站,但是无法使用它进行工作。
这是我正在使用的代码。以curl登录php

首先,我从网站获取csrf标记以确保它匹配。
但我得到的结果总是登录表单。

$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; 

有谁知道我为什么不能登录?

表单字段是正确的,当我进行登录尝试cookie.txt文件已更改。

+0

在打开PHP标记 (例如'<?php error_reporting(E_ALL);)后立即向文件顶部添加错误报告。 ini_set('display_errors',1);'然后你的代码的其余部分,看看它是否产生任何东西。 –

+0

@ Fred-ii-我没有看到任何错误,只是为了让您知道我正在使用laravel 5 – Szenis

+0

您可能需要为它添加标签,这可能与它有一些相关性。我无法确定它是否有影响,因为我对拉拉维尔一无所知。 –

回答

1

最有可能的原因是:

  1. 你重新初始化卷曲你的CRSF令牌之后,因此它成为了后续请求无效,因为这是一个完全不同的会话至于网站有关。

  2. $postinfo是一个字符串,所以你需要通过手(CURLOPT_POSTFIELD S还接受关联数组,在这种情况下,你不需要做)到urlencode()值。

+0

我已经尝试与urlencode和数组,但这并没有改变任何东西。然而,我正在做2个卷曲请求,这可能是一个问题吗?如果是这样我怎么能得到csrf标记? – Szenis

+0

您可能需要'urlencode()'令牌,用户名和密码,或使用数组。现在的方式(用'@'显然不是百分比编码的)不会飞行。请求的数量并不重要,只要你不在中间调用'curl_init()'。并且务必在第一次GET之前设置COOKIEFILE和COOKIEJAR,以便curl得到会话cookie并在随后的POST中重新发送它们。 – lafor

+0

是的,它的确是csrf标记。 – Szenis

1

有几点建议我都能想到。这些都是基于以前的经验,当它不适合我时,我终于通过试验和错误来实现它。

确保cookies.txt是可写的。放置在一个单独的文件夹cookie.txt的您的www根外的地方,并使用绝对路径改变$ cookie的值:

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

尝试登录后,检查文件是否包含cookie的值。如果它包含cookie值,但不包含需要识别为登录的cookie值,则可能会有一些额外的服务器端检查,以防止除了令牌检查之外从服务器外部提交表单。

查看正常人类登录表单的网址,例如, http://www.example.com/accounts/loginform.html - 或者您使用的网址,以获取令牌,并添加作为引荐:

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

设置一些选项,让你看起来更显人性:

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:' 
    )); 

上面的例子头阵列中的工作我特殊案例。在您的情况下,当人类登录时可能会发送其他头文件。请尝试使用浏览器登录一次,然后在浏览器的开发人员工具中检查一起发送的请求头,然后复制/粘贴它们。也doublecheck发布隐藏值(在我的情况下需要添加“& __VIEWSTATE = somereallylongIIScode”到CURLOPT_POSTFIELDS字符串)。

+0

感谢您的帮助,正确的网址有点不同,我认为它不是'''http://www.example.com/accounts/loginform'''',而是''http :// www.example.com/accounts/loginform /''''永远不会成为问题的一部分。 – Szenis

+0

太棒了,很高兴你得到它的工作..我需要上述得到我的工作:-) –