我尝试使用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'));
答案 0 :(得分:1)
解决:最后问题是由于POST中的编码问题。最初,POST数据是使用http_build_query()从数组创建的。现在,POST数据被简单地连接起来,并且键和值都是单独的urlencoded:
$options.=urlencode($fieldName).'='.urlencode($element->getAttribute('value'));
答案 1 :(得分:0)
见以下网址: -
试试这个: -
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);
}