Вход в Joomla 1.5 с использованием внешней формы (не в папке joomla, а на том же сервере) - PullRequest
5 голосов
/ 03 марта 2011

У меня в настоящее время есть установка Joomla 1.5, а также другой веб-сайт. Они оба находятся на одном веб-сервере. Однако они находятся в разных папках в каталоге wwwroot. Я хотел бы разместить форму входа на веб-сайте, не принадлежащем Joomla, который будет регистрировать пользователя в Joomla. Я уже пробовал копировать и вставлять код формы входа в систему Joomla на страницу на сайте, не принадлежащем Joomla, и все работает нормально, пока значение секретной формы не будет правильным. Любая помощь с благодарностью.

EDIT: Вот код -

Контактная форма:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Untitled Document</title>
</head>

<body>
<form id="login" name="login" method="post" action="login.php">
  <label>
  <input name="username" type="text" id="username" value="username" />
  </label>
    <label>
    <input name="password" type="password" id="password" value="password" />
    </label>
  </p>
  <p>
    <label>
    <input type="submit" name="submit" id="submit" value="Submit" />
    </label>
  </p>
</form>
</body>
</html>

Сценарий входа в систему:

<?php
$uname = $_POST['username'];
$upswd = $_POST['password'];
$url = "http://www.mywebsite.com/joomla_site/index.php";

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

Ответы [ 3 ]

9 голосов
/ 06 марта 2011

Хорошо, чтобы это сработало, вот что нужно сделать -

  1. Создайте новый сеанс и получите соответствующий токен
  2. Передайте имя пользователя, пароль и токен для создания сеанса вошедшего в систему
  3. Получить новые значения файлов cookie для авторизованного сеанса
  4. Перенос куки в браузер

Вот код, необходимый для выполнения всего этого:

<?php
$uname = $_POST['username'];
$upswd = $_POST['password'];
$url = "http://joomla website.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_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);
}

// POST fields
$postfields = array();
$postfields['username'] = urlencode($uname);
$postfields['passwd'] = urlencode($upswd);
$postfields['option'] = 'com_user';
$postfields['task'] = 'login';
$postfields[$spoof[1]] = '1';
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
$ret = curl_exec($ch);

// 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, если URL-адрес, используемый в сценарии, имеет форму входа на странице. После запуска этого скрипта вы сможете получить доступ к веб-сайту и войти в систему.

1 голос
/ 03 марта 2011

Это не работает, потому что Joomla требует уникальный токен с каждым запросом входа в систему.Он генерирует новый токен каждый раз, когда создает форму входа в систему, и этот токен связан с сеансом пользователя.Чтобы ваш логин работал, вам нужно будет создать новый сеанс и вытащить связанный токен для отправки с вашей формой.Некоторое время назад был похожий вопрос, на котором есть несколько хороших ответов о том, как установить сеанс и получить токен.

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

0 голосов
/ 18 ноября 2012

Я получил это по-другому (после дня переписывания кода и пробовал разные вещи).Прежде всего, убедитесь, что файл php находится в вашем корневом каталоге Joomla.Если токен и вход в систему работают, но ваш браузер не получает cookie-файл, поместите его в ПЕРЕД почтовым индексом.Сделал это и все работает нормально.Еще раз спасибо Брент за помощь.

<?php
$uname = $_GET['username'];
$upswd = $_GET['password'];
$url = "http://www.myJoomlaSite.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_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);
}

// 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]);

// POST fields
$postfields = array();
$postfields['username'] = urlencode($uname);
$postfields['passwd'] = urlencode($upswd);
$postfields['option'] = 'com_user';
$postfields['task'] = 'login';
$postfields[$spoof[1]] = '1';
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
$ret = curl_exec($ch);
?>
...