2012-08-08 132 views
1

我尝试使用curl登录到SSL安全网站,但不知何故,我不明白。curl登录,两次传递会话cookie

第一个卷曲连接检索登录表单。现在开始解决SSL问题。用于身份验证和所有隐藏字段的字段被标识并用于以下POST。 cookie文件已定义,还有要读取的jar文件。该cookie文件是可访问的,并在每次登录尝试时得到更新。会话cookie由curl成功设置。 HTTPHEADER将被删除,以停止点击100继续墙的请求。卷曲配置为跟进并发送引用者。 但是,我仍然无法找到脚本卡在哪里。 Curl和PHP都不会发出任何错误消息或警告。

这里是缩短的脚本:

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_VERBOSE,  1); 
curl_setopt($ch, CURLOPT_HEADER,  1); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1); 
curl_setopt($ch, CURLOPT_AUTOREFERER, 1); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:')); // remove Expect header to avoid 100 Continue situations 
curl_setopt($ch, CURLOPT_USERAGENT,  'Mozilla [abbreviated]'); 
curl_setopt($ch, CURLOPT_CAINFO,  dirname(__FILE__).'/cacert.pem'); 
curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(__FILE__).'/cookie.hq.txt'); // write cookies 
curl_setopt($ch, CURLOPT_COOKIEJAR,  dirname(__FILE__).'/cookie.hq.txt'); // read cookies 
curl_setopt($ch, CURLOPT_COOKIESESSION, 1); 
curl_setopt($ch, CURLOPT_URL,   'https://the_url.jsp'); 

$data = curl_exec($ch); 
$error= curl_error($ch); 
if(!empty($error)) 
    echo '<p>'.$error.'</p>'; 
else 
    echo '<p>ok</p>'; 

现在脚本读取的形式,在凭证和回用相同的curl_init车把支柱填充:

curl_setopt($ch, CURLOPT_POST,  1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $options); 
$data = curl_exec($ch); 
$error=curl_error($ch); 

但是,所有我回来是相同的形式,并根据CURLOPT_COOKIESESSION设置相同的会话cookie或新的。

当我手动登录时,我注意到还有两个cookie集:LtpaToken和LtpaToken2,但我从来没有看到它们出现在由脚本打印的请求标头中。 即使没有Javascript已激活,也可以手动提交表单。所以在提交之前,不能有一些JS魔法修改表单数据。 显然我在这里失去了一些东西。任何想法,我可以看得更远?

解决:最后问题是由于POST中的编码问题。 最初,POST数据是使用http_build_query()从数组创建的。 现在POST数据仅仅是串联和键和值分别url编码:

$options.=urlencode($fieldName).'='.urlencode($element->getAttribute('value')); 
+0

要确认JS不修改,应使用类似Firebug工具,内置的开发者控制台检查在浏览器中的POST请求。 – Prasanth 2012-08-08 17:07:18

+0

我已将请求转移到显示完整$ _REQUEST数组的页面,并且没有任何内容与原始表单不同。 – jayo 2012-08-08 17:34:37

回答

1

解决:最后,问题是由于POST中的编码问题。最初,POST数据是使用http_build_query()从数组创建的。现在,POST数据仅仅是串联和键和值分别url编码:

$options.=urlencode($fieldName).'='.urlencode($element->getAttribute('value')); 
0

见下面链接: -

cURL login session

,并尝试这个办法: -

http://php.net/manual/en/function.curl-setopt.php

<?php 

echo curl_grab_page("https://www.example.net/login.php", "https://www.example.net/", "username=foo&password=bar", "true", "null", "false"); 

// $url = page to POST data 
// $ref_url = tell the server which page you came from (spoofing) 
// $login = true will make a clean cookie-file. 
// $proxy = proxy data 
// $proxystatus = do you use a proxy ? true/false 

function 
curl_grab_page($url,$ref_url,$data,$login,$proxy,$proxystatus){ 
    if($login == 'true') { 
     $fp = fopen("cookie.txt", "w"); 
     fclose($fp); 
    } 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie.txt"); 
    curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie.txt"); 
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 40); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
    if ($proxystatus == 'true') { 
     curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, TRUE); 
     curl_setopt($ch, CURLOPT_PROXY, $proxy); 
    } 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 

    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_REFERER, $ref_url); 

    curl_setopt($ch, CURLOPT_HEADER, TRUE); 
    curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); 
    curl_setopt($ch, CURLOPT_POST, TRUE); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 
    ob_start(); 
    return curl_exec ($ch); // execute the curl command 
    ob_end_clean(); 
    curl_close ($ch); 
    unset($ch); 
}