2010-02-06 7 views
1

Je dois me connecter avec un script PHP qui utilise CURL sur un site web Joomla, afin d'accéder à une page privée qui doit être traitée, mais nonobstant plusieurs tentatives que j'ai faites, je avoir toujours une erreur 403 J'ai fait une chose similaire avec d'autres sites Web et cela a fonctionné.CURL se connecter par script à un site web Joomla

Script J'utilise:

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

Le nom d'utilisateur et mot de passe, ainsi que l'URL du site que je utilise fonctionnent parfaitement.

Ceci est le résultat je reçois:

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 

Y at-il quelque chose de mal dans ma demande de CURL? Ou y a-t-il une limite avec la connexion à distance Joomla?

Merci pour vos suggestions!

Répondre

0

La requête cURL semble correcte sur elle-même. Il peut s'agir d'un problème du côté du serveur plutôt que de votre requête. Il peut s'agir d'un fichier .htaccess foiré ou d'autorisations non valides pour les fichiers qui ne se manifestent que lors de tentatives de connexion "automatisées".

+0

Je pensais aussi ceci. BTW, il échoue également par CURL en ligne de commande ... – Paryeshakaya

+0

Si je comprends bien, vous n'avez pas accès aux journaux du serveur pour voir quelle erreur il produit? –

+0

Malheureusement pas :-( – Paryeshakaya

2

Vous avez plusieurs probelms ici ..

tout d'abord vous utilisez les mauvais champs. option = "com_user" non "login" task = "login" (am Asuming vous parlez de joomla 1.5, pas joomla 1.0, ils sont différents)

mais le plus gros problème que vous avez est que joomla met étiquette unique sous toutes les formes, et cette valeur ne peut être utilisée qu'une seule fois. cela signifie qu'un formulaire de connexion ne peut être soumis qu'une fois, il ne peut pas être volé et rejoué comme vous essayez de le faire. (même si ce n'est pas pour un processus infâme)

donc vous devrez demander la page de connexion joomla, grattez les valeurs du formulaire, puis soumettez à nouveau les données. Alternativement, vous pouvez créer un plugin qui fait ce que vous voulez.

+0

Salut, merci pour l'explication.A propos des champs (comme option = login), ils sont exactement ceux dans le formulaire de connexion d'origine.Je vais essayer comme vous le suggérez.Je ne sais pas quelle version de Joomla est utilisé – Paryeshakaya

2

Vous savez, j'ai écrit quelque chose de vraiment similaire cette semaine pour faire quelques tests sur notre installation de Joomla. L'astuce consiste à faire deux requêtes sur le site: une pour récupérer un jeton de connexion unique et créer une session utilisateur, et une autre pour se connecter.

Vous devez partager le cookie entre les deux requêtes et chaque nouvel utilisateur de requête session va générer un nouveau jeton, je crois.

Voici mon script bash, en utilisant 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" 
} 

Utilisation:

$ login www.google.com "username" "password" 

Vous pourriez probablement traduire à friser en PHP, ou tout simplement utiliser un appel exec droite() si vous sommes sur un système * nix, et pas trop préoccupé par la sécurité. (Mettre du code qui nécessite exec() en production, est un bon moyen de faire fonctionner votre SysAdmin ou votre CM).

3

Voici une traduction PHP simplifiée de la réponse de Paul Sweeney. Cela fonctionne dans 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

besoin de déclarer '$ spoof'? – Black

+0

vous pouvez le penser, mais PHP crée la variable si elle n'est pas déclarée.Voir les exemples manuels php, ils ressemblent tous à' preg_match ($ motif, $ sujet, $ matches) 'avec $ matchs non déclarés – yitwail

1

En utilisant le code php yitwail, j'ai essayé http://demo.joomla.org/1.5/ avec le nom d'utilisateur/passe demo/demo, a créé un mydomain.com/yitwails_php_script.php et a couru. Ne devrais-je pas être en mesure d'aller à la démo de joomla maintenant, et déjà être connecté? Cela ne semble pas fonctionner de cette façon - ai-je oublié quelque chose dans le processus?

+0

J'ai essayé la même chose et elle n'a pas été transmise, tout le monde a la réponse à ce sujet? – Presto

Questions connexes