2010-02-06 118 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 

有什么错误的,我卷曲的要求?或者Joomla远程登录有限制吗?

感谢您的建议!

回答

0

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

+0

我也在想这个。顺便说一句,它也失败了命令行CURL ... – Paryeshakaya 2010-02-06 08:59:15

+0

据我所知,你没有访问服务器的日志,看看它产生了什么错误? – 2010-02-06 09:52:02

+0

不幸的是:-( – Paryeshakaya 2010-02-06 11:02:21

2

你这里有几个probelms ..

首先你使用了错误的领域。 选项=“com_user”而不是“登录” 任务=“登陆” (AM asuming你正在谈论的Joomla 1.5,不是的Joomla 1.0,它们是不同的)

但你最大的问题是把Joomla把一个每种形式都有独特的标签,并且该值只能使用一次。所以这意味着登录表单只能提交一次,它不能被盗取和重播,就像你正在做的那样。 (即使它不是一个邪恶的过程)

所以你将不得不请求joomla登录页面,刮取表单值,然后重新提交数据。

或者你可以创建一个你想要的插件。

+0

嗨,感谢您的解释。关于字段(如option = login),它们就是原始登录表单中的那些字段。我会按照您的建议尝试。我不知道使用了哪个版本的Joomla – Paryeshakaya 2010-02-08 11:07:18

2

你知道,我本周写了一些非常相似的东西来测试我们的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卷曲,或者只是使用直EXEC()调用,如果你'在一个* nix系统上,而不是太在意安全性。 (将需要执行exec()的代码放入生产环境,是获得SysAdmin或CM的好方法)。

3

下面是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); 
+1

需要声明'$ spoof'? – Black 2016-05-22 23:44:47

+0

你可能会这么认为,但PHP会创建变量,如果它没有被声明的话,看看php手册的例子,它们看起来都像'preg_match($ pattern,$ subject,$ matches)'with $匹配未声明的 – yitwail 2016-06-08 07:36:13

1

使用yitwail的PHP代码,我试图http://demo.joomla.org/1.5/使用用户名/密码演示/演示,创造了一个mydomain.com/yitwails_php_script.php并运行它。我现在应该不能去joomla演示,并且已经登录?它似乎并没有这样工作 - 我在这个过程中丢失了什么?

+0

我尝试了相同的方法,但没有通过。任何人都可以在此得到答案? – Presto 2012-05-18 20:05:50