1

我尝试使用 curl 登录 SSL 安全网站,但不知何故我做错了。

第一个 curl 连接检索登录表单。最初的 SSL 问题现在已解决。用于身份验证的字段和所有隐藏字段都被识别并用于以下 POST。cookie 文件和要读取的 jar 文件都已定义。cookie 文件是可访问的,并随着每次登录尝试而更新。curl 成功设置了会话 cookie。移除 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 句柄将其返回:

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

2 回答 2

1

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

$options.=urlencode($fieldName).'='.urlencode($element->getAttribute('value'));
于 2012-08-11T09:07:32.173 回答
0

见以下网址:--

cURL 登录会话

试试这个:-

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);
}
于 2012-08-08T17:10:18.083 回答