无法使用php curl获取.aspx页面

时间:2012-06-01 20:35:21

标签: php asp.net curl

我正在尝试使用curl登录到安全的aspx站点,并检索一些帐户的数据。
该页面使用aspx __VIEWSTATE来跟踪浏览器的状态。通过检查请求标题,这里是序列:

来自Login.aspx的用户GETS(包括__VIEWSTATE)
用户POSTS __VIEWSTATE,loginName和loginPassword到login.aspx - >服务器以302响应 用户GETS Submissions.aspx

submissions.aspx是由__EVENTTARGET = dgrdSubmissions $ ctl0x $ ctl00引用的不同客户的表,其中第一个$ ctl0x表示该客户端的行。

用户POSTS _ VIEWSTATE, _EVENTTARGET和AdmissionsView param to submissions.aspx - >服务器以302响应 用户GETS Policy.aspx

这在浏览器中工作正常(Chrome - 该网站在Firefox中可疑地中断了Message:抛出了类型'System.Web.HttpUnhandledException'的异常)但在我的php脚本中,GET Policy.aspx以登录页面响应不是预期的客户信息。

这是我的代码(减去错误检查和页面显示):
助手功能:

function curl_page($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
$data=curl_exec($ch);
curl_close($ch);
return $data;
}

function curl_ssl_page($url="",$postdata=""){
$ch = curl_init();
$cookie = 'cookie.txt';
curl_setopt ($ch, CURLOPT_URL, $url); 
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6"); 
curl_setopt ($ch, CURLOPT_TIMEOUT, 60); 
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt ($ch, CURLOPT_COOKIEJAR, $cookie); 
curl_setopt ($ch, CURLOPT_REFERER, $url); 
curl_setopt ($ch, CURLOPT_POSTFIELDS, $postdata); 
curl_setopt ($ch, CURLOPT_POST, 1); 
$result = curl_exec ($ch);

return $result;
}

function curl_get_page($url=""){

$ch = curl_init();
$cookie = 'cookie.txt';
curl_setopt ($ch, CURLOPT_URL, $url); 
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6"); 
curl_setopt ($ch, CURLOPT_TIMEOUT, 60); 
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt ($ch, CURLOPT_COOKIEFILE, $cookie); 
curl_setopt ($ch, CURLOPT_REFERER, $url); 

$result = curl_exec ($ch);
return $result;
}

Pages - Login:

if(isset($_POST['user-name'])) {
    //GET login page
    $url = "http://www.gryphinonline.ca/Login.aspx";
    $login_page = $this->curl_page($url);

    // get viewstate
    $regexViewstate = '/__VIEWSTATE\" value=\"(.*)\"/i';
    $regexEventVal  = '/__EVENTVALIDATION\" value=\"(.*)\"/i';

$viewstate = $this->regexExtract($login_page,$regexViewstate,1);
$eventval = $this->regexExtract($login_page, $regexEventVal,1);

//Post to login page
$postdata = '__VIEWSTATE='.rawurlencode($viewstate)
     .'&txtLoginName='.$_POST['user-name']
     .'&txtPassword='.$_POST['password']
     .'&Start=Login+%2F+Ouverture+de+session';

$this->curl_ssl_page($url,$postdata);
header("Location:http://url-edited/submissions");
}

Pages - Submissions:
    $url = "http://www.gryphinonline.ca/Submissions.aspx";
$submissions = $this->curl_get_page($url);

$dom = new DOMDocument();
@$dom->loadHTML($submissions);

// scrape for data including viewstate
$view = $dom->getElementById('dgrdSubmissions'); 
if(!$view) header("Location://url-edited/login");

    $h_data = $dom->getElementsByTagName('div');
$h_data = $h_data->item(0);

if(isset($_POST['__EVENTTARGET'])){
    $postdata=array();
    foreach ($_POST as $key => $value) {
        $postdata[]=$key.'='.$value;
    }
    $postdata = implode('&', $postdata);

    $this->curl_ssl_page($url,$postdata);
    header("Location:http://url-edited/policy");        
}

Pages - Policy:
    $url = "http://www.gryphinonline.ca/Policy.aspx";
$policy = $this->curl_get_page($url);

据我所知,所有HTTP请求和cookie都是相同的。任何人都知道这里发生了什么?这可能与网站的Firefox问题有关,还是我误解了一些基本的东西?

我已经在这里待了几天,我们将不胜感激。

1 个答案:

答案 0 :(得分:1)

原来我忘记了将POST字符串urlencode为提交。