我尝试使用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'));
要确认JS不修改,应使用类似Firebug工具,内置的开发者控制台检查在浏览器中的POST请求。 – Prasanth 2012-08-08 17:07:18
我已将请求转移到显示完整$ _REQUEST数组的页面,并且没有任何内容与原始表单不同。 – jayo 2012-08-08 17:34:37