CURL login por script a un sitio web de Joomla

Necesito iniciar sesión mediante un script PHP que utiliza CURL en un sitio web de Joomla, para poder acceder a una página privada que debe procesarse, pero no obstante varios bashs que he hecho, siempre tengo un error 403. He hecho algo similar con otros sitios web y funcionó.

Script que uso:

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

El nombre de usuario y la contraseña, así como la URL del sitio web que estoy usando, funcionan perfectamente.

Este es el resultado que obtengo:

 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 

¿Hay algo mal en mi solicitud de CURL? ¿O hay un límite con el inicio de sesión remoto de Joomla?

Gracias por las sugerencias!

Aquí hay una traducción PHP simplificada de la respuesta de Paul Sweeney. Funciona en 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); 

Tienes varios probelmas aquí ..

primero estás usando los campos equivocados. option = “com_user” no “login” task = “login” (supongo que estás hablando de joomla 1.5, no de joomla 1.0, son diferentes)

pero el mayor problema que tienes es que Joomla pone una etiqueta única en todas sus formas, y ese valor solo se puede usar una vez. eso significa que un formulario de inicio de sesión solo puede enviarse una vez, no puede ser robado y reproducido como lo está intentando hacer. (incluso si no es para un proceso nefasto)

por lo que tendría que solicitar la página de inicio de sesión de joomla, raspar los valores del formulario y luego volver a enviar los datos.

alternativamente, podrías crear un complemento que haga lo que quieras.

Sabes, esta semana escribí algo muy similar para hacer algunas pruebas en nuestra instalación de Joomla. El truco consiste en realizar dos solicitudes al sitio: una para obtener un token de inicio de sesión único, y crear una sesión de usuario, y otra para iniciar sesión realmente.

Tienes que compartir la cookie en ambas solicitudes, y cada nueva sesión de usuario de solicitud generará un nuevo token, creo.

Aquí está mi script en bash, usando 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" } 

Uso:

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

Probablemente puedas traducir esto a curl en PHP, o simplemente usar una llamada directa de exec () si estás en un sistema * nix y no te preocupes demasiado por la seguridad. (Poner el código que requiere la ejecución de exec (), es una buena manera de hacer que su SysAdmin o CM funcionen).

Usando el código php de yitwail, probé http://demo.joomla.org/1.5/ con el nombre de usuario / pase demo / demo, creé un midominio.com/yitwails_php_script.php y lo ejecuté. ¿No debería poder ir a la demostración de Joomla ahora y ya estar conectado? No parece funcionar de esa manera. ¿Me estoy perdiendo algo en el proceso?

La solicitud de cURL parece estar bien en sí misma. Puede ser un problema del lado del servidor en lugar de su solicitud: podría haber un archivo .htaccess dañado o permisos no válidos para los archivos allí, que solo se manifiestan durante los bashs de inicio de sesión “automatizados”.