卷曲登录,会话cookie两次通过

时间:2012-08-08 16:47:49

标签: php curl

我尝试使用curl登录到SSL安全网站,但不知何故我没有做对。

第一个curl连接检索登录表单。现在解决了开头的SSL问题。识别用于身份验证的字段和所有隐藏字段,并将其用于以下POST。定义了cookie文件,并从中读取了jar。 cookie文件是可访问的,并且每次登录尝试都会更新。会话cookie由curl成功设置。删除HTTPHEADER以阻止请求命中100 Continue墙。 Curl配置为跟进并发送引用。 但是,我仍然无法找到脚本卡在哪里。 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句柄将其POST回来:

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

但是我得到的所有内容都是同一个表单,同一个会话cookie或一个新的cookie取决于CURLOPT_COOKIESESSION设置。

当我手动登录时,我注意到还有两个cookie设置:LtpaToken和LtpaToken2,但我从未在脚本打印的请求标题中看到它们。 即使没有Javascript激活,手动提交表单也能正常工作。所以在提交之前不可能有一些JS魔术修改表单数据。 显然我在这里遗漏了一些东西。我可以进一步了解哪些想法?

解决:最后问题是由于POST中的编码问题。 最初,POST数据是使用http_build_query()从数组创建的。 现在,POST数据被简单地连接起来,并且键和值都是单独的urlencoded:

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

2 个答案:

答案 0 :(得分:1)

解决:最后问题是由于POST中的编码问题。最初,POST数据是使用http_build_query()从数组创建的。现在,POST数据被简单地连接起来,并且键和值都是单独的urlencoded:

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

答案 1 :(得分: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);
}