2010-02-06 3 views
1

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

Сценарий я использую:

$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?

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

ответ

0

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

+0

Я тоже думал об этом. BTW, он не работает также с помощью командной строки CURL ... – Paryeshakaya

+0

Насколько я понимаю, у вас нет доступа к журналам сервера, чтобы узнать, какую ошибку он производит? –

+0

К сожалению, нет :-( – Paryeshakaya

2

У вас есть несколько probelms здесь ..

во-первых, вы используете неправильные поля. вариант = «com_user» не «войти в систему» ​​ задача = «Войти» (я asuming вы говорите о Joomla 1.5, не Joomla 1.0, они разные)

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

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

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

+0

Привет, спасибо за объяснение. О полях (например, option = login), они точно такие, как в исходной форме входа. Я попробую, как вы предлагаете. Я не знаю, какая версия Joomla используется – Paryeshakaya

2

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

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

Вот мой сценарий в Баш, используя 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() вызов, если 're на системе * nix и не слишком беспокоиться о безопасности. (Ввод кода, который требует exec() в производство, является хорошим способом, чтобы ваш SysAdmin или CM работал вверх).

3

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

нужно объявить '$ spoof' – Black

+0

, вы можете так подумать, но PHP создает переменную, если она не объявлена. Посмотрите на примеры руководства PHP, все они выглядят как' preg_match ($ pattern, $ subject, $ matches) 'с $ совпадения uneclared – yitwail

1

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

+0

Я пробовал то же самое, и он не прошел. У кого есть ответ на это? – Presto

Смежные вопросы