curl を使用して安全な aspx サイトにログインし、アカウントのデータの一部を取得しようとしています。
このページは aspx __VIEWSTATE を使用して、ブラウザーの状態を追跡します。ここでリクエストヘッダーを確認すると、シーケンスは次のようになります。
ユーザーが Login.aspx から GETS (__VIEWSTATE を含む)
ユーザーが __VIEWSTATE、loginName、loginPassword を login.aspx に投稿 -> サーバーが 302 user GETS Submissions.aspx で応答
submits.aspx は、__EVENTTARGET=dgrdSubmissions$ctl0x$ctl00 によって参照されるさまざまなクライアントのテーブルで、最初の $ctl0x はそのクライアントの行を表します。
ユーザー POSTS _ VIEWSTATE、 _EVENTTARGET、および AdvisorView パラメーターを submits.aspx に -> サーバーは 302 ユーザー GETS Policy.aspx で応答します
これはブラウザーで正常に動作します (Chrome - Firefox でサイトが疑わしく壊れ、メッセージ: Exception of type '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 の問題に関連している可能性がありますか、それとも基本的なことを誤解していますか?
私はこれを数日間行ってきましたが、何か助けていただければ幸いです。