CURL вход по сценарию на сайт Joomla

Мне нужно войти с помощью PHP-скрипта, который использует CURL, на веб-сайте Joomla, чтобы получить доступ к частной странице, которую необходимо обработать, но, несмотря на несколько попыток, которые я предпринял, у меня всегда возникает ошибка 403. Я сделал то же самое с другими сайтами, и это сработало.

Скрипт, который я использую:

$uname = "id";
$upswd = "pswd";
$url = "http://www.somewebpage.com";
$agent = "'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6'";

$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_COOKIEJAR, './cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, './cookie.txt');
curl_setopt($ch, CURLOPT_USERAGENT, $agent );
curl_setopt($ch, CURLOPT_HEADER, TRUE );
curl_setopt($ch, CURLOPT_REFERER, $url1);

// POST fields
$postfields = array();
$postfields['username'] = urlencode($uname);
$postfields['passwd'] = urlencode($upswd);
$postfields['remember'] = 'yes';
$postfields['option'] = 'login';
$postfields['op2'] = 'login';
$postfields['return'] = urlencode($url);
$postfields['message'] = '0';
$postfields['force_session'] = '1';
$postfields['j3b00d36f4336137f4f03335c5eee6440'] = '1';
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);

$ret = curl_exec($ch);

Имя пользователя и пароль, а также URL-адрес веб-сайта, который я использую, отлично работают.

Вот результат, который я получаю:

HTTP/1.1 100 Continue

HTTP/1.1 403 Forbidden
Date: Sat, 06 Feb 2010 08:29:36 GMT
Server: Apache/2.2.13 (Unix) mod_ssl/2.2.13 OpenSSL/0.9.7a DAV/2 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635
X-Powered-By: PHP/5.2.10
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html

Что-то не так в моем запросе CURL? Или есть ограничение на удаленный вход в Joomla?

Спасибо за предложения!


person Paryeshakaya    schedule 06.02.2010    source источник


Ответы (5)


Вот упрощенный PHP-перевод ответа Пола Суини. Это работает в Joomla 1.5 :)

$uname = "id";
$upswd = "pswd";
$url = "http://www.somewebpage.com";

$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_COOKIEJAR, './cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, './cookie.txt');
curl_setopt($ch, CURLOPT_HEADER, FALSE );
$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);
}

// POST fields
$postfields = array();
$postfields['username'] = urlencode($uname);
$postfields['passwd'] = urlencode($upswd);
$postfields['lang'] = '';
$postfields['option'] = 'com_login';
$postfields['task'] = 'login';
$postfields[$spoof[1]] = '1';
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
$ret = curl_exec($ch);
person yitwail    schedule 25.12.2010
comment
нужно объявить $spoof ? - person Black; 23.05.2016
comment
вы можете так подумать, но PHP создает переменную, если она не объявлена. Посмотрите на примеры руководства по php, все они выглядят как preg_match($pattern, $subject, $matches) с необъявленными $matches - person yitwail; 08.06.2016

У вас тут несколько проблем..

во-первых, вы используете неправильные поля. option="com_user" не "login" task="login" (предполагаю, что вы говорите о joomla 1.5, а не о joomla 1.0, они разные)

но самая большая проблема заключается в том, что joomla помещает уникальный тег в каждую форму, и это значение можно использовать только один раз. так что это означает, что форму входа можно отправить только один раз, ее нельзя украсть и воспроизвести, как вы пытаетесь сделать. (даже если это не для гнусного процесса)

поэтому вам нужно будет запросить страницу входа в joomla, очистить значения формы, а затем повторно отправить данные.

в качестве альтернативы вы можете создать плагин, который делает то, что вы хотите.

person Bingy    schedule 08.02.2010
comment
Привет, спасибо за объяснение. Что касается полей (например, option=login), то они точно такие же, как и в исходной форме входа. Я попробую, как вы предлагаете. Я не знаю, какая версия Joomla используется - person Paryeshakaya; 08.02.2010

Вы знаете, я написал что-то действительно похожее на этой неделе, чтобы протестировать нашу установку Joomla. Хитрость заключается в том, чтобы сделать два запроса к сайту: один для получения уникального токена входа и создания сеанса пользователя, а другой для фактического входа в систему.

Вы должны разделить файл cookie между обоими запросами, и я полагаю, что каждый новый сеанс пользователя запроса будет генерировать новый токен.

Вот мой скрипт в bash, использующий wget:

function login {
    Server=$1
    User=$2
    Pass=$3
    Token=`wget \
        --quiet \
        --load-cookies ~/cookies.${User}.txt \
        --save-cookies ~/cookies.${User}.txt \
        --keep-session-cookies \
        --output-document=- \
        "http://${Server}/administrator" | \
    grep -Po '"[a-zA-z0-9]{32}"' | \
    grep -o "[^'\"]*"`

    wget \
        --quiet \
        --load-cookies ~/cookies.${User}.txt \
        --save-cookies ~/cookies.${User}.txt \
        --keep-session-cookies \
        --output-document=/dev/null \
        --post-data="username=${User}&passwd=${Pass}&option=com_login&task=login&${Token}=1" \
        "http://${Server}/administrator/index.php?option=com_login"
}

Использование:

$ login www.google.com "username" "password"

Вероятно, вы могли бы перевести это в curl в PHP или просто использовать прямой вызов exec(), если вы работаете в системе * nix и не слишком беспокоитесь о безопасности. (Внедрение в производство кода, требующего exec(), — хороший способ заставить вашего системного администратора или менеджера по работе работать).

person Paul Sweeney    schedule 13.02.2010

Используя php-код yitwail, я попробовал http://demo.joomla.org/1.5/ с именем пользователя /pass demo/демо, создал mydomain.com/yitwails_php_script.php и запустил его. Разве я не могу сейчас перейти к демо-версии joomla и уже войти в систему? Кажется, это не работает - я что-то упустил в процессе?

person curlNoob    schedule 14.04.2011
comment
То же самое пробовал и не прошло. У кого-нибудь есть ответ по этому поводу? - person codacopia; 19.05.2012

Запрос cURL сам по себе выглядит нормально. Это может быть проблема на стороне сервера, а не в вашем запросе — может быть испорченный файл .htaccess или недействительные разрешения для файлов, которые проявляются только во время таких «автоматических» попыток входа в систему.

person Pawel J. Wal    schedule 06.02.2010
comment
Я так понимаю, у вас нет доступа к логам сервера, чтобы посмотреть, какую ошибку он выдает? - person Pawel J. Wal; 06.02.2010