2012-08-12 100 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不能帮你。