使用外部表单login到Joomla 1.5(不在joomla文件夹中,但在同一台服务器上)

我目前有一个Joomla 1.5安装,以及另一个网站。 他们都驻留在同一个Web服务器上。 但是,它们位于wwwroot目录中的不同文件夹中。 我想在非joomla网站上放置一个login表单,这个login表单会将用户login到Joomla。 我已经尝试将Joomlalogin表单代码复制并粘贴到非Joomla网站的页面上,并且一切正常,直到秘密表单值不正确。 任何帮助是极大的赞赏。

编辑:这是代码 –

联系表:

<!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> 

login脚本:

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

好的,为了在这里工作是需要做的 –

  1. 创build一个新的会话并获取关联的令牌
  2. 通过用户名,密码和令牌来创buildlogin会话
  3. 获取已login会话的新cookie值
  4. 将cookie传输到浏览器

这是完成所有这些所需的代码:

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

只要脚本中使用的URL在页面上有login表单,就可以在任何Joomla网站上运行。 一旦你运行这个脚本,你应该能够访问该网站并login。

这不工作,因为Joomla需要每个login请求一个唯一的标记。 它在每次创buildlogin表单时都会生成一个新的令牌,并且该令牌与用户会话相关联。 为了让你的login工作,你将不得不创build一个新的会话,并拉关联令牌提交您的表单。 后来有一个类似的问题,就如何build立会话和获取令牌有一些很好的答案。

通过脚本CURLlogin到Joomla网站

我以不同的方式工作(经过一天的重写代码,尝试不同的事情)。 首先,请确保php文件在你的Joomla根目录下。 如果令牌和login工作,但您的浏览器没有得到的cookie放在代码之前的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); ?>