PHP CURL スクリプトを使用して Web サイトにログインしたいのですが、最後のステップでループにリダイレクトされます。
Firefox と Internet Explorer を使用しているときに、Fiddler を使用して HTTP 要求と応答をキャプチャしました。スクリプトの手順を再作成しました。
このサイトには、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 がこのフォームを送信すると、適切なコンテンツにリダイレクトされます。しかし、私の CURL スクリプトはこの同じページにリダイレクトされますが、フォーム入力には RedirectURL 値が次のように設定されています。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>
Fiddler を使用して、ブラウザと CURL の実行をコピー アンド ペーストし、1 行ずつ比較しました。どちらも同じ情報を送信しています。Cookie が不足していません。
私が見ることができる唯一の違いは、送信されたヘッダーの順序と送信された COOKIES の順序です。
Firefox と同じヘッダーを送信するように 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
カールヘッダー
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: の前に User-Agent を送信し、Accept-Encoding: の順序が異なることです。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);
もう 1 つの違いは、Cookie が送信される順序です。CURL に Cookie の管理を任せているため、順序を制御することはできません。私が自分でクッキーを管理し、CURLOPT_COOKIE
オプションで設定しない限り、それは苦痛のようです.
では、ヘッダーの順序および/または送信される COOKIES の順序が、スクリプトが実際のブラウザーではなく、保護されたコンテンツからリダイレクトされていることをサーバーに伝えている可能性が最も高いでしょうか? もしそうなら、どうすればこれを変更できますか?それとも、他に何か不足していますか?
編集 これは@MARC_Bコメント用です「javascript設定Cookie」がすべてを言います。
はい、CURL は JavaScript を実行しないことを理解しています。JavaScript を確認し、スクリプト内のアクションを複製しました。ログイン フォームを送信した後の 1 ページで、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 を実行して複製するだけです。
私は進歩を遂げました。かなり長い一日のグーグル検索の後、Web フォームの 1 つが、リソースを保護するCA Siteminderソフトウェアの一部であることがわかりました。リンクのドキュメントは、フォームが使用されているブラウザーを収集することを示しています。エージェント名はフォーム内で暗号化されています (なぜそれが必要なのかはわかりません)。ブラウザが重要な理由に関するドキュメントは見つかりませんでした。暗号化された文字列は、agentname ヘッダーから作成されるのか、送信されたヘッダー名の組み合わせと順序を使用して作成されるのだろうか。
Cookie を設定せずにスクリプトを開始していました。応答ヘッダーの行ごとに 2 回目のレビューを行った後、2 つの特定の Cookie に注目しました。2 つの Cookie のスクリプト 1 を実行するたびに、応答で設定されることはありませんでした。しかし、場合は毎回異なります。
Firefox でログインしたときに表示されるすべての Cookie を含む Cookie ファイルをセットアップすることにしました。今回は、スクリプトは上記のページを 1 回ループした後、新しいページに進みました。新しいページには、ブラウザーの種類と設定を検出する JavaScript が含まれています。ページの分析にはしばらく時間がかかります。
したがって、必要ないくつかの Cookie のうちの 1 つが欠けていたというのが答えのようです。
誰かが Siteminder エコシステムと ASP の典型的なログ スクリプトに光を当てることができれば、それについて聞きたいです。