Вход 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?

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

Вот упрощенный перевод 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); 

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

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

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

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

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

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

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

Вот мой сценарий в 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" 

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

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

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