Php CURL通过脚本登录到Joomla网站

Php CURL通过脚本登录到Joomla网站,php,curl,login,joomla,Php,Curl,Login,Joomla,我需要通过使用CURL的PHP脚本登录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 Fi

我需要通过使用CURL的PHP脚本登录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
我的卷发要求有问题吗?或者Joomla远程登录有限制吗


谢谢你的建议

cURL请求本身似乎很好。这可能是服务器端的问题,而不是您的请求中的问题-可能是一个混乱的.htaccess文件,或者对其中的文件的权限无效,这些只有在自动登录尝试期间才会出现。

您这里有几个问题

首先,您使用了错误的字段。 option=com\u用户未登录 任务=登录 我想你说的是joomla 1.5,不是joomla 1.0,它们是不同的

但最大的问题是joomla在每个表单中都放置了一个唯一的标记,并且该值只能使用一次。这意味着登录表单只能提交一次,不能像您尝试的那样被窃取和重放。即使不是为了一个邪恶的过程

因此,您必须请求joomla登录页面,删除表单值,然后重新提交数据


或者,你可以创建一个插件来做你想做的。

你知道,我本周写了一些非常类似的东西来对我们的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"

您可能会将其转换为PHP中的curl,或者如果您使用的是*nix系统,并且不太关心安全性,则可以直接使用exec调用。将需要exec的代码投入生产,是一种让系统管理员或CM工作的好方法。

以下是Paul Sweeney答案的简化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);

使用yitwail的php代码,我尝试使用username/pass demo/demo,创建了一个mydomain.com/yitwails\u php\u script.php并运行它。难道我现在不能去joomla演示,并且已经登录了吗?它似乎不是这样工作的-我在这个过程中遗漏了什么吗?

据我所知,您没有访问服务器日志的权限来查看它产生了什么错误?您好,谢谢您的解释。关于option=login之类的字段,它们与原始登录表单中的字段完全相同。我会照你的建议去做。我不知道使用了哪一个版本的Joomla,我尝试了同样的版本,但没有通过。有人知道这个问题的答案吗?需要声明$spoof吗?您可能会这么认为,但是如果没有声明,PHP会创建变量。看看php手册示例,它们看起来都像preg_match$pattern、$subject、$matches和$matches未声明