web-dev-qa-db-ja.com

cURLを使用したリモートログイン

他の場所でJoomlaサイトに認証され、 Brent Friar's ニースプログラムに従っていたユーザーにログインしようとしていますが、2つの変更を適用する必要がありました。

  1. フォームに含まれていたフィールド「返品」を追加しました
  2. com_userではなくcom_usersを参照

そのサイトに特定のカスタマイズがあるかどうか、特定のログインモジュールを使用しているかどうか、または別のバージョンかどうかはわかりません。サイトへの管理者アクセス権がないため、確認できません。今、私のスクリプトは実行されていますが、ユーザーに正常にログインしていません-期待どおりのCookieを受け取りません。

代わりに、サイトに戻ります

HTTP/1.1 100続行

HTTP/1.1 303他の日付を参照:2014年7月23日水曜日18:18:25 GMTサーバー:Apache/2.2.22 X-Powered-By:PHP/5.2.17場所: http://www.strassenbau .forum-kundenportal.de/login-erfolgreich Content-Length:0 Connection:close Content-Type:text/html; charset = utf-8

私はJoomlaを少し知っていますが、それとのhttp通信の深さについては何も知りません。そのため、ここで何が問題なのかわかりません。

これが私のコードです:

<?php

$uname = "*** secret";
$upswd = "*** credentials";
$url = "http://www.strassenbau.forum-kundenportal.de/login-anmeldung";
set_time_limit(0);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url );
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE );
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE );
curl_setopt($ch, CURLOPT_COOKIESESSION, TRUE );
curl_setopt($ch, CURLOPT_COOKIEJAR, realpath('./cookie.txt'));
curl_setopt($ch, CURLOPT_COOKIEFILE, realpath('./cookie.txt'));
curl_setopt($ch, CURLOPT_HEADER, TRUE );
$ret = curl_exec($ch);

if (!preg_match('/name="([a-zA-z0-9]{32})"/', $ret, $spoof)) {
    preg_match("/name='([a-zA-z0-9]{32})'/", $ret, $spoof);
}

preg_match('/name="return" value="(.*)"/', $ret, $return); // search for hidden field "return" and get its value

// POST fields
$postfields = array();
$postfields['username'] = urlencode($uname);
$postfields['password'] = urlencode($upswd);
$postfields['option'] = 'com_users';
$postfields['task'] = 'user.login';
$postfields['return'] = $return[1];
$postfields[$spoof[1]] = '1';
// edit: using the location of the 303-result directly...but it does not make a difference
curl_setopt($ch, CURLOPT_URL , "http://www.strassenbau.forum-kundenportal.de/login-erfolgreich");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
$ret = curl_exec($ch);

echo "ret2: <pre>"; var_dump($ret); echo "</pre>";  // no cooking being set here!

// Get logged in cookie and pass it to the browser
preg_match('/^Set-Cookie: (.*?);/m', $ret, $m);
$cookie=explode('=',$m[1]);
setcookie($cookie[0], $cookie[1]);


?>

答えを探していたところ、Joomlaは現在セッショントークンも使用しているため、その理由で機能しないというコメントを見つけました。誰かがその説明を確認できますか?しかし、そのような状況でリモートログインはどのように処理されますか?独自のログインモジュールを実装することで問題を克服できますか?

3
MBaas

私はようやくAutoLogin-Extensionを使用して問題を解決しました(JEDへのハイパーリンクは削除されました)。

pdate:昔は問題なく動作しましたが(Joomla 2)、拡張機能は廃止されたようです。そのため、この解決策が役に立たない場合はごめんなさい。

0
MBaas

認証の問題を解決するには、IP LoginをインストールしてIPを有効にします。 http://extensions.joomla.org/search ?q = ip +

PD:preg_match( "/ name = ...が「return」トークンだけでなく、他の要素を見つけている可能性があります。

0
Anibal

追加しようとしましたか

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
0
jdog