2012-08-12 48 views
1

我想使用php CURL腳本登錄到網站,但它在最後一步被重定向到一個循環。我的php CURL登錄腳本未在asp頁面成功

我使用Fiddler捕獲HTTP請求和使用Firefox和Internet Explorer時的響應。我重新創建了腳本中的步驟。

該網站有幾個步驟,涉及302重定向,提交表單前的JavaScript設置cookie以及位置重定向。

所有這些都進行得很好,直到最後一步。該網站加載以下內容。

HTTP/1.1 200 OK 
Connection: Keep-Alive 
Server: Microsoft-IIS/5.0 
Date: Sun, 12 Aug 2012 15:51:55 GMT 
X-Powered-By: ASP.NET 
Set-Cookie: SMSESSION=*omitted by me*; path=/; domain=website.com 
Content-Length: 511 
Content-Type: text/html 
Set-Cookie: BIGipServerPortal_80_Green=3741601290.20480.0000; expires=Sun, 12-Aug-2012 17:51:57 GMT; path=/ 
Cache-Control: private 
X-PvInfo: [S10201.C29051.A26868.RA0.G7175.U147B7189].[OT/html.OG/pages] 
Vary: Accept-Encoding, User-Agent 
Content-Encoding: gzip 



<!--START:INC\common\include.asp--> 
<!--START:INC\common\errorfns.asp--> 

<!--END:INC\common\errorfns.asp--><!--START:INC\common\newconstant.asp--> 

<!--END:INC\common\newconstant.asp--><!--START:INC\common\securityfns.asp--> 

<!--END:INC\common\securityfns.asp--><!--START:INC\common\newptintllocales.asp--> 

<!--END:INC\common\newptintllocales.asp--> 

<!--START:INC\common\newptintl.asp--> 


<!--END:INC\common\newptintl.asp--> 

<!--START:INC\common\newutility.asp--> 

<!--END:INC\common\newutility.asp--> 
<!--END:INC\common\include.asp--><!--START:INC\sso\vendors\ActiveDirectoryServer.asp--> 


<!--END:INC\sso\vendors\ActiveDirectoryServer.asp--><!--START:INC\sso\vendors\netegrity.asp--> 


<!--END:INC\sso\vendors\netegrity.asp--><!--START:INC\sso\vendors\oblix.asp--> 


<!--END:INC\sso\vendors\oblix.asp--> 
<!--START:INC\sso\vendors\securant.asp--> 


<!--END:INC\sso\vendors\securant.asp--><!--START:INC\sso\vendors\Tivoli.asp--> 


<!--END:INC\sso\vendors\Tivoli.asp--> 
<!--START:INC\sso\vendors\customsso.asp--> 


<!--END:INC\sso\vendors\customsso.asp--> 
<!--START:INC\sso\ssoutility.asp--> 


<!--END:INC\sso\ssoutility.asp--> 
<!--START:INC\sso\sso.asp--> 


    <HTML> 
     <BODY onload="javascript:void(document.dologin.submit())"> 
      <FORM ACTION="../admin/dologin.asp" METHOD="POST" NAME="dologin"> 
       <INPUT TYPE="HIDDEN" NAME="RedirectURL" VALUE=""> 
       <INPUT TYPE="HIDDEN" NAME="ssoMode" VALUE="1"> 
      </FORM> 
     </BODY> 
    </HTML> 



<!--END:INC\sso\sso.asp--> 

當Firefox提交此表單時,它會被重定向到正確的內容。但我捲曲的腳本將被重定向到這個相同的頁面,但表單輸入現在已設置爲admin/login.asp?Mode=1

<HTML> 
     <BODY onload="javascript:void(document.dologin.submit())"> 
      <FORM ACTION="../admin/dologin.asp" METHOD="POST" NAME="dologin"> 
       <INPUT TYPE="HIDDEN" NAME="RedirectURL" VALUE="/admin/login.asp?Mode=1"> 
       <INPUT TYPE="HIDDEN" NAME="ssoMode" VALUE="1"> 
      </FORM> 
     </BODY> 
    </HTML> 

的 的redirectUrl值我已經使用小提琴手複製和粘貼在瀏覽器和捲曲的執行和他們相比線線。兩者都發送相同的信息,我不會錯過任何cookie。

我能看到的唯一區別是發送的標題的順序和發送的COOKIES的順序。

我調整了我的CURL發送與firefox相同的標題,但我無法獲得相同的順序。

火狐部首

GET https://www.website.aa.com/ HTTP/1.1 
Host: www.website.com 
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:14.0) Gecko/20100101 Firefox/14.0.1 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 

CURL HEADER

GET /login/SMLogin.jsp? HTTP/1.1 
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:14.0) Gecko/20100101 Firefox/14.0.1 
Host: www.website.com 
Accept-Encoding: gzip, deflate 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.5 
Connection: keep-alive 

最大的區別是CURL HOST之前發送用戶代理:和接受編碼:是按照不同的順序。 我試圖通過設置不同順序的CURL選項來重新排列事物,但似乎無法獲得與Firefox相同的順序。

這裏是我的捲曲的選擇。(我省略了選擇GET或POST和創建查詢字符串的步驟)

//process the header 
$headerArray = array(); 
$headerArray[] = 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'; 
$headerArray[] = 'Accept-Language: en-us,en;q=0.5'; 
$headerArray[] = 'Connection: keep-alive'; 
    if($ref != ""){ 
    $headerArray[] = 'Referer: ' . $ref; 
    } 
curl_setopt($ch, CURLOPT_HTTPHEADER, $headerArray) ; 

// set up the cURL resource 
curl_setopt($ch, CURLOPT_TIMEOUT, CURL_TIMEOUT); // Timeout 
curl_setopt($ch, CURLOPT_USERAGENT, WEBBOT_NAME); // Webbot name 
curl_setopt($ch, CURLOPT_ENCODING, "gzip, deflate"); 

// SSL SECTION 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1); 
curl_setopt($ch, CURLOPT_CAINFO, getcwd() . '\cert\ca-bundle.crt'); 

// Cookie management. 
curl_setopt($ch, CURLOPT_COOKIEJAR, COOKIE_FILE); 
curl_setopt($ch, CURLOPT_COOKIEFILE, COOKIE_FILE); 


curl_setopt($ch, CURLINFO_HEADER_OUT, TRUE);  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);  
curl_setopt($ch, CURLOPT_URL, $target); 

的另一個區別是在cookie被髮送的順序。由於我讓CURL 處理cookie管理,我無法控制訂單。除非我自己管理這些餅乾,並將它們設置爲CURLOPT_COOKIE選項,但這看起來很痛苦。

那麼最有可能的頭部順序和/或正在發送的COOKIES的順序是告訴服務器我的腳本不是真正的瀏覽器並將我從受保護的內容重定向?如果是的話,我該如何改變這一點?還是我錯過了別的?

編輯這是@MARC_B評論「JavaScript設置cookies」說的一切。

是的我明白CURL不會做JavaScript。我已經檢查了JavaScript,並複製了腳本中的操作。在提交登錄表單後的一頁上,javascript驗證用戶名,然後設置一個cookie。

if (validate) { 
     document.cookie = "loggedIn=yes"; 
     document.Login.submit(); 
} 

因此,檢索頁面後,腳本將上面的cookie寫入cookie文件。

$handle = fopen("cookies.txt", "a"); 

$cookie = "website.com FALSE /login/ FALSE 0 loggedIn yes"; 

fwrite($handle, $cookie); 
fclose($handle); 

其他javascript操作只是自動提交表單,它只執行需要複製的CURL。

我已經取得了進展。經過相當長時間的搜索後,我發現其中一個webforms是CA Siteminder軟件的一部分,用於保護資源。鏈接文檔顯示錶單收集正在使用的瀏覽器。代理名稱在表單中被加密(不知道爲什麼需要)。我找不到任何有關瀏覽器爲什麼重要的文檔。我想知道加密字符串是從agentname頭創建還是通過使用發送的頭名稱的組合和順序創建的。

我剛剛開始沒有設置cookie的腳本。在逐行迴應標題之後,我專注於2個特定的Cookie。 2個cookie的腳本1的每次運行都不會在響應中設置。但是,如果每次都會有所不同。

我決定將cookie文件設置爲使用Firefox登錄時顯示的所有cookie。這一次腳本在上述頁面循環一次後繼續到新頁面。新頁面具有檢測瀏覽器類型和設置的JavaScript。分析該頁面需要一段時間。

所以答案似乎是我錯過了幾個必要的cookie中的一個。

如果任何人都可以對Siteminder生態系統和asp腳本的典型日誌有所瞭解,我想聽聽它。

+0

「javascript設置cookie」說明了一切。 curl只是做HTTP。它不會在檢索到的html中執行任何JS,也不會執行PHP。 – 2012-08-12 18:29:38

+0

只有一個cookie集,我在腳本中創建了cookie並將其保存在cookie文件中。它被正確提交。這不是問題。 – jmm 2012-08-12 18:32:41

回答

0

試着調試js函數和emu他們。如果你不能,那麼curl不能幫你。