2012-08-08 93 views
1

我嘗試使用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')); 
+0

要確認JS不修改,應使用類似Firebug工具,內置的開發者控制檯檢查在瀏覽器中的POST請求。 – Prasanth 2012-08-08 17:07:18

+0

我已將請求轉移到顯示完整$ _REQUEST數組的頁面,並且沒有任何內容與原始表單不同。 – jayo 2012-08-08 17:34:37

回答

1

解決:最後,問題是由於POST中的編碼問題。最初,POST數據是使用http_build_query()從數組創建的。現在,POST數據僅僅是串聯和鍵和值分別url編碼:

$options.=urlencode($fieldName).'='.urlencode($element->getAttribute('value')); 
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); 
}