2010-02-06 4 views
1

처리해야하는 개인 페이지에 액세스하기 위해 Joomla 웹 사이트에 CURL을 사용하는 PHP 스크립트로 로그인해야하지만, 여러 번 시도 했음에도 불구하고 항상 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을 표시합니다.

이 결과는 내가 얻을 수있다 : 내 CURL 요청에 뭔가 문제가

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

나는 또한 이것을 생각하고 있었다. BTW, 명령 줄 CURL도 실패합니다 ... – Paryeshakaya

+0

제가 이해할 수 있듯이 서버 로그에 액세스하여 어떤 오류가 발생했는지 확인할 수 없습니까? –

+0

불행히도 :-( – Paryeshakaya

2

당신은 여기에 몇 가지 probelms이 ..

는 먼저 잘못된 필드를 사용하고 있습니다. 옵션 = "com_user"하지 = "로그인" 작업 "로그인"

(당신에게 asuming하고 줌라 1.5에 대해 이야기하고, 1.0 Joomla를하지, 그들은 다른)하지만 당신이 가지고있는 가장 큰 문제는 줌라가를두고 있다는 것입니다 고유 한 태그를 사용할 수 있으며 해당 값은 한 번만 사용할 수 있습니다. 따라서 로그인 양식은 한 번만 제출할 수 있으며, 시도하려는 것처럼 도난 당하거나 재생 될 수 없습니다. (비록 사소한 프로세스가 아닐지라도)

그래서 joomla 로그인 페이지를 요청하고 양식 값을 긁어 낸 다음 데이터를 다시 제출해야합니다.

또는 원하는 것을 수행하는 플러그인을 만들 수 있습니다.

+0

안녕하세요, 설명해 주셔서 감사합니다. (옵션 = 로그인과 같은) 필드는 원래 로그인 양식에있는 것입니다. 내가 제안한대로 시도해 볼 것입니다. 사용되는 Joomla 버전을 모르겠습니다. – Paryeshakaya

2

Joomla 설치에 대한 테스트를 수행하기 위해 이번 주에 비슷한 것을 썼습니다. 트릭은 사이트에 두 가지 요청을하는 것입니다. 하나는 고유 한 로그인 토큰을 가져오고 하나는 사용자 세션을 만들고 다른 하나는 실제로 로그인하는 것입니다.

두 요청 모두에서 쿠키를 공유해야하며 새 요청 사용자 세션이 새로운 토큰을 생성합니다.

여기에 wget과 사용, bash는 내 스크립트입니다 :

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에서 곱슬 곱슬, 아니면 그냥 (직선 간부를 사용하려면이 번역 수) 당신이 경우 전화 * 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

+0

그렇게 생각할 수도 있지만 PHP는 선언되지 않은 변수를 생성합니다. PHP 매뉴얼 예제를 보면, $ preg_match ($ pattern, $ subject, $ matches)'와 같이 보입니다. 일치하지 않음 – yitwail

1

는 yitwail의 PHP 코드를 사용하여, 나는 이름/패스 데모/데모와 http://demo.joomla.org/1.5/을 시도한 mydomain.com/yitwails_php_script.php을 생성하고 실행. 나는 지금 joomla 데모에 갈 수 없어야하며 이미 로그인되어 있어야합니까? 그런 식으로 작동하지 않는 것 같습니다. 과정 중에 뭔가가 누락 되었습니까?

+0

나는 똑같은 시도를했으나 통과하지 못했습니다. 누구나 대답을 할 수 있습니까? – Presto

관련 문제