2012-08-12 5 views
1

PHP CURL 스크립트를 사용하여 웹 사이트에 로그인하고 싶지만 마지막 단계에서 루프로 리디렉션됩니다.내 PHP CURL 로그인 스크립트가 ASP 페이지에서 성공하지 못했습니다.

Firefox와 Internet Explorer를 사용하는 동안 Fiddler를 사용하여 HTTP 요청 및 응답을 캡처했습니다. 나는 대본에있는 단계들을 재창조했다.

사이트에는 302 리디렉션, 양식 제출 직전의 JavaScript 설정 쿠키 및 위치 재 지정과 관련된 여러 단계가 있습니다.

이 모든 것이 마지막 단계까지 잘 진행되었습니다. 웹 사이트는 다음을로드합니다.

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가이 양식을 제출하면 적절한 내용으로 리디렉션됩니다. 하지만 내 CURL 스크립트는 다음과 같은 페이지로 리디렉션되지만 폼 입력은 지금은 복사 브라우저와 CURL의 실행을 붙여 피들러를 사용했다 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 값이에 의해 그들에게 선을 비교 선. 둘 다 똑같은 정보를 보내고 있습니다. 나는 쿠키를 놓치지 않았습니다.

내가 볼 수있는 유일한 차이점은 전송 된 헤더의 순서와 전송 된 COOKIES의 순서입니다.

파이어 폭스와 동일한 헤더를 보내도록 내 CURL을 조정했지만 동일한 주문을받을 수 없습니다.

파이어 폭스 헤더

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와 동일한 주문을받을 수 없습니다. 여기

내 CURL 옵션이다. (나는 쿼리 문자열을 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); 

다른 차이는 쿠키가 전송되는 순서입니다. CURL 이 쿠키 관리를 처리하도록하기 때문에 주문을 제어 할 수 없습니다. 쿠키를 직접 관리하지 않고 CURLOPT_COOKIE 옵션으로 설정하지 않으면 고통 스러울 것 같습니다.

쿠키의 순서 및/또는 보내는 쿠키의 순서가 서버에 내 스크립트가 실제 브라우저가 아니며 보호 된 콘텐츠에서 나를 리디렉션 할 가능성이 가장 큽니까? 그렇다면 어떻게 변경할 수 있습니까? 아니면 다른 것을 놓치고 있습니까?

EDIT 이것은 @MARC_B의 코멘트입니다. "javascript setting cookies"는이 모든 것을 말합니다.

예 CURL은 javascript를 사용하지 않는다는 것을 알고 있습니다. 자바 스크립트를 검토하고 스크립트에서 액션을 복제했습니다. 로그인 양식을 제출 한 후 한 페이지에서 javascript는 사용자 이름의 유효성을 확인한 다음 쿠키를 설정합니다.

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

따라서 페이지를 검색 한 후 스크립트는 위의 쿠키를 쿠키 파일에 기록합니다.

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

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

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

다른 자바 스크립트 동작은 자동으로 양식을 제출하여 복제 할 CURL 만 실행합니다.

나는 진전을 이뤘다. 인터넷 검색이 상당히 긴 하루가 지난 후 웹 양식 중 하나가 리소스를 보호하는 소프트웨어 CA Siteminder의 일부인 것으로 나타났습니다. 링크 문서는 양식이 사용중인 브라우저를 수집 함을 보여줍니다. 에이전트 이름은 암호화되어 있으므로 (필요한 이유가 확실하지 않은) 양식에 있습니다. 나는 브라우저가 왜 중요한지에 대한 문서를 찾을 수 없었다. 암호화 된 문자열이 agentname 헤더에서 생성되었거나 전송 된 헤더 이름의 조합 및 순서를 사용하여 작성되었는지 궁금합니다.

쿠키를 설정하지 않고 스크립트를 시작했습니다. 두 번째 검토 후 응답 헤더 라인별로, 나는 2 개의 특정 쿠키에 중점을 둡니다. 2 개의 쿠키 중 스크립트 1이 실행될 때마다 응답에 설정되지 않았습니다. 그러나 매번 다른 경우.

Firefox로 로그인 할 때 나타나는 모든 쿠키로 쿠키 파일을 설정하기로 결정했습니다. 이번에는 스크립트가 위에서 언급 한 페이지를 반복하면서 새 페이지로 이동했습니다. 새 페이지에는 브라우저 유형 및 설정을 감지하는 JavaScript가 있습니다. 페이지를 분석하는 데 시간이 걸릴 것입니다.

그래서 대답은 몇 가지 필요한 쿠키 중 하나가 누락 된 것 같습니다.

Siteminder 에코 시스템과 일반적인 로그인 스크립트 인 asp에 대한 의견을 듣고 싶습니다.

+0

"javascript setting cookies"는 모든 것을 말합니다. 컬은 단지 HTTP를 수행합니다. 그것은 검색된 HTML에서 JS를 실행하지 않으며 PHP도 실행하지 않습니다. –

+0

쿠키 세트가 하나 뿐이므로 스크립트에서 쿠키를 생성하고 쿠키 안에 저장했습니다. 올바르게 제출되었습니다. 그것은 문제가 아닙니다. – jmm

답변

0

js 기능을 디버그하고 emu를 시도하십시오. 할 수 없다면 컬링이 도움이되지 않습니다.

관련 문제