我嘗試使用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