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