CURL войти по сценарию на сайт Joomla - PullRequest
1 голос
/ 06 февраля 2010

Мне нужно войти через 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?

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

Ответы [ 5 ]

3 голосов
/ 26 декабря 2010

Вот упрощенный перевод 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);
2 голосов
/ 08 февраля 2010

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

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

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

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

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

2 голосов
/ 13 февраля 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 (), - хороший способ проработать ваш SysAdmin или CM).

1 голос
/ 14 апреля 2011

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

0 голосов
/ 06 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...