2010-07-16 6 views
7

I 로컬 사이트의 로그인 폼에서 외부 사이트 응용 프로그램 (asp.net 응용 프로그램)에 로그인 할 수있는 다음 코드 (PHP로 작성된)이 있습니다PHP 컬 - 게시의 asp.net viewstate가 값

<?php 
$curl_connection = curl_init('www.external.com/login.aspx'); 

curl_setopt($curl_connection, CURLOPT_CONNECTTIMEOUT, 30); 
curl_setopt($curl_connection, CURLOPT_USERAGENT, 
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"); 
curl_setopt($curl_connection, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($curl_connection, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, 1); 

// Post data array 
$post_data['LoginControl$UserName'] = 'ExampleUName'; 
$post_data['LoginControl$Password'] = 'ExamplePWord'; 

// Add form fields into an array to get ready to post 
foreach ($post_data as $key => $value) 
    { 
$post_items[] = $key . '=' . $value; 
    } 
$post_string = implode ('&', $post_items); 

// Tell cURL which string to post 
curl_setopt($curl_connection, CURLOPT_POSTFIELDS, $post_string); 

// Execute and post 
$result = curl_exec($curl_connection); 
?> 

I을 로그인 한 응용 프로그램으로 이동하는 대신 외부 사이트의 로그인 양식으로 이동하십시오. 문제는 viewstate 값을 전달해야하지만 그 방법에 대해 어떻게 할 지 모르겠다는 것입니다.

외부 응용 프로그램을 제어 할 권한이 없습니다. 그러나 우리는 사용자가 브랜딩 등을 유지하기 위해 웹 사이트를 통해 응용 프로그램에 로그인 할 수 있기를 바랍니다.

최근에 php cURL을 사용하는 것에 대해 다른 스레드를 게시했지만 지금은 무대에 있습니다. 내가 viewstate가 문제라고 생각하는 곳 ...

감사합니다.

답변

2

변경 :

curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, 1); 

에 : 당신은 또한 쿠키 파일을 설정해야합니다

curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, false); 

, CURLOPT_COOKIEFILE

에서

CURLOPT_COOKIEFILE을 살펴 :

의 이름을 쿠키 데이터를 포함하는 파일 쿠키 파일은 Netscape 형식이거나 파일에 덤프 된 일반 HTTP 스타일 헤더 일 수 있습니다.

CURLOPT_COOKIE

:

의 내용 "쿠키"헤더는 HTTP 요청에서 사용할 수 있습니다. 그 여러 쿠키는 공백 세미콜론 (;)으로 구분 참고 (예를 들어, "과일 = 사과, 붉은 색 =")

CURLOPT_COOKIEJAR :

그는 이름 연결에 대한 모든 내부 쿠키를 저장하는 파일의 닫는다.

@see는 http://www.php.net/manual/en/function.curl-setopt.php

curl_setopt($curl_connection, CURLOPT_COOKIEFILE, 'cookiefile.txt'); 
curl_setopt($curl_connection, CURLOPT_COOKIEJAR, 'cookiefile.txt'); 
+0

덕분에 - 응답 에드을 위해 .. 외부 사이트에 로그인 양식에 –

4

이것은 asp.net 페이지를 긁어하려고 할 때 진짜 문제가 될 것으로 보인다.

페이지에는 "__VIEWSTATE"라는 숨김 필드가 들어 있으며이 필드에는 페이지를 보낼 때 페이지 상태의 일부 또는 전체를 포함하는 base64로 인코딩 된 집합이 들어 있습니다. 일반적으로 viewstate의 SHA1도 포함합니다.

귀하의 게시물에 _VIEWSTATE의 모든 내용이 포함되어 있어야합니다. 그렇지 않으면 실패합니다.

저자는 전체 페이지 상태를 viewstate에두기로 선택한 두 개의 필드 만 있지만 더 복잡한 페이지는없는 간단한 로그인 페이지를 게시 할 수있었습니다.

아직까지 해결책을 찾지 못했습니다.

+0

덕분에 사람들을 추가했지만 여전히 감독되었다. 또한 VIEWSTATE 값 때문이라는 결론에 도달했습니다. –