• Publicidad

Login con Perl en phpbb2

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

Notapor zozo666 » 2007-07-26 13:45 @614

Me loguea igual que antes pero no soluciona el problema de la cookie. Paso a explicar un poquito más detallado:

Tengo este Perl que lee las cookies:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/bin/perl

use CGI;
$query = new CGI;

print $query->header;

print $query->start_html('Leer Cookie');

print $query->h3('The cookie is ...');
$theCookie = $query->cookie('phpbb2mysql_data');
$theCookie2 = $query->cookie('phpbb2mysql_sid');

print "\n"; print $theCookie2; print "\n"; print $theCookie; print "\n";
print $query->end_html;
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Con este programa, si me registro desde el foro, me lee las cookies que son phpbb2mysql_data y phpbb2mysql_sid y sus respectivos valores:

phpbb2mysql_data = a:2:{s:11:"autologinid";s:0:"";s:6:"userid";s:1:"N";} cambia la N en negrita según el usuario

phpbb2mysql_sid =57e3d55ada143ae8c246068bbe973a2b (números de esta forma, cambian constantemente).

Estas dos cookies son las que me arma el login.php.

Lo que necesito es que al correr el PROGRAMA DE LECTURA de las cookies que tengo, me lea las cookies que acabé de hacer con el programa de WWW::Mechanize, o sea, que las cookies ya se armen como lo haría en el login.php.

Espero que me puedan ayudar.
zozo666
Perlero nuevo
Perlero nuevo
 
Mensajes: 139
Registrado: 2007-05-26 10:36 @483

Publicidad

Notapor explorer » 2007-07-26 15:41 @695

Las cookies que está 'leyendo' tu CGI, están saliendo del cliente web que ejecuta el CGI. No están almacenadas en ninguna parte del servidor. Sólo están en el cliente (navegador).

Creo entender que el proceso es: registrarte en login.php con la ayuda de WWW::Mechanize y luego recuperar las cookies a través del CGI, para luego poder dialogar con phpbb con ese CGI.

Bien. Eso significa que las cookies deben quedar residentes en un lugar común que pueda ser accedido por los dos programas. Vamos a suponer que es /tmp/galletas.txt.

El primer programa, el del WWW::Mechanize, es fácil de modificar para que deje las cookies en ese sitio. WWW::Mechanize se estará comportando como un cliente web y su jarra de galletas quedará ahí.

Luego, el CGI. El CGI se ejecuta a través de la invocación de otro cliente web. La petición del cliente al servidor web hará que éste lo ejecute en el lado del servidor. Lo que debe hacer el CGI es abrir la jarra de galletas y de esta manera saber las cookies que se abrieron antes, y así, poder hablar con phpbb en el propio servidor.

Para que el CGI pueda abrir la jarra de galletas, tenemos que decirle donde está, y que la parsee:

(Sácado de la página de manual de CGI::Cookie)
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use CGI::Cookie;
my $jarra_de_galletas = qx(cat /tmp/galletas.txt);   # Leemos la jarra de galletas
my %cookies = parse CGI::Cookie($jarra_de_galletas); # Lo interpretamos
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Estas líneas, dentro del CGI, permitirán el acceso a las cookies leídas antes. Por ejemplo: print $cookies{phpbb2mysql_sid}.

Lo que ya tengo más dudas es si es posible que desde dentro del CGI se puedan hacer peticiones al phpbb. Estamos hablando de una petición web dentro de otra.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor zozo666 » 2007-07-26 16:18 @721

¿Tendría que quedar así el código completo?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
 
use HTTP::Cookies;
use WWW::Mechanize;
use DBI;
use warnings;
use Digest::MD5 qw(md5 md5_hex md5_base64);
use CGI;

# Nuestra jarra de galletas
my $jarra_de_galletas
    = HTTP::Cookies->new(
        file     => "$ENV{HOME}/tmp/galletas.txt",        # Lugar donde guardaremos las cookies
        autosave => 1,
);

use CGI::Cookie;
$jarra_de_galletas = qx(cat /tmp/galletas.txt);   # Leemos la jarra de galletas
my %cookies = parse CGI::Cookie($jarra_de_galletas); # Lo interpretamos

# Nuestro agente
my $agente = WWW::Mechanize->new( cookie_jar => $jarra_de_galletas );

print "content-type: text/html \n\n";

# Traemos la página de login
$agente->get('http://localhost:8080/phpbb1/login.php');

# Nos logueamos
my $res = $agente->submit_form(
    with_fields => {
                    username => "roberto",
                    password => "123456",
                    autologin=> 'off',
                    },
    button      => 'login',
);

# Si hemos tenido éxito
if ( $res->is_success ) {

    # Pedimos el panel de control
    $agente->get('http://localhost:8080/phpbb1/profile.php?mode=editprofile');

    # Buscamos el formulario con el email
    $agente->form_with_fields('email')     or die "ERROR: No encuentro el formulario";

    # Lo sacamos a pantalla
    print $agente->value('email'), "\n";  
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


De esta forma armé el código yo, pero:

1) ¿No tendría que saber en qué parte guarda las cookies el login.php para de esta forma decirle a este programa que las lea de acá?

2) La cookie es la misma que generaría el login?

-----------------------------------------------------------------------------
Paso a explicar el proceso de logueo para ver si se entiende lo que pienso
El proceso de logueo en sí es muy fácil.

- En la base de datos, cuando nos logueamos con login.php, se carga en la tabla "phpbb_sessions" el valor de la cookie "phpbbmysql_sid", en el campo session_id y el campo "session_logged_in" (el antepenúltimo campo) se carga con el valor "1" también, a su vez se cargan otras campos que no le damos mucha importancia.

Código: Seleccionar todo
INSERT INTO `phpbb_sessions` VALUES ('[b]abc3adfe17d3ca273b420f6effe0d8f5[/b]', 3, 1185486830, 1185486830, '7f000001', 0,[b] 1[/b], 0);


El programa que me facilitaron carga la base de datos, pero las cookies no las registro. Ya probé de todas formas que me dijeron y ninguna funcionó.

¿El código de arriba realiza la misma tarea que hace el login.php en el mismo lugar? Yo lo que necesito es que se genere sin problemas la cookie porque con el trabajo en la base de datos no hay problema ya que lo hace sin inconvenientes.

Por cierto, ¿por qué se usa eso de jarra_de_galletas? Todavía no me queda nada claro.
Última edición por zozo666 el 2007-07-26 17:26 @768, editado 1 vez en total
zozo666
Perlero nuevo
Perlero nuevo
 
Mensajes: 139
Registrado: 2007-05-26 10:36 @483

Notapor explorer » 2007-07-26 18:53 @828

La Jarra de Galletas (Cookie Jar) es el fichero donde están las galletas (cookies).

En cuanto al código, que se trata del momento del registro de un usuario en el foro, decir:

* Has mezclado código que era del CGI en el programa del registro de usuario. Repasamos: en el programa que hace el ingreso del usuario (el del WWW::Mechanize), sólo hay que definir la $jarra_de_galletas como un objeto HTTP::Cookies, en cuyo atributo file es el fichero que almacenará esa jarra. Yo elegí /tmp/galletas.txt, pero debes elegir una que sea visible tanto para este programa como para el cgi.

* En el cgi, la $jarra_de_galletas es un objeto CGI::Cookie, que debe ser parseado para ver las cookies que hay en su interior (y que el primer programa dejó).

* Sigues marcando autologin como 'off', cuando lo recomendable es dejarlo 'on'.

Para responder a tus preguntas:
1. El lugar donde guarda las cookies es el cookie jar, que se lo has dicho en el momento de crear el objeto WWW::Mechanize. Y en el CGI, la cookie jar la lees con un cat y luego la parseas (con la función parse).

2. El cgi encontrará la misma cookie si le has dicho que lea la jarra de galletas y la parsee.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor zozo666 » 2007-07-27 01:00 @083

Disculpen mi ignorancia, pero como "parseo" la $jarra_de_galletas???
¿Se realiza así?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

use CGI::Cookie;
my $jarra_de_galletas = qx(cat /tmp/galletas.txt);   # Leemos la jarra de galletas
my %cookies = parse CGI::Cookie($jarra_de_galletas); # Lo interpretamos

print $cookies{phpbb2mysql_sid}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
?

¿Alguien tiene idea dónde almacena el phpbb la jarra de galletas? ¿O tienen alguna forma de averiguarlo?

Mi código quedó de la siguiente forma:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

use WWW::Mechanize;
use HTTP::Cookies;
use strict;
use warnings;

# Nuestra jarra de galletas
my $jarra_de_galletas
    = HTTP::Cookies->new(
        file     => "$ENV{HOME}/lwp_cookies.dat",        # Lugar donde guardaremos las cookies
        autosave => 1,
);

# Nuestro agente
my $agente = WWW::Mechanize->new( cookie_jar => $jarra_de_galletas );

# Traemos la página de login
$agente->get('http://localhost:8080/phpbb1/login.php');

# Nos logueamos
my $res = $agente->submit_form(
    with_fields => {
                    username => 'pablog89',
                    password => '123456',
                    autologin=> 'on',
                    },
    button      => 'login',
);

# Si hemos tenido éxito
if ( $res->is_success ) {

    # Pedimos el panel de control
    $agente->get('http://localhost:8080/phpbb1/profile.php?mode=editprofile');

    # Buscamos el formulario con el email
    $agente->form_with_fields('email')     or die "ERROR: No encuentro el formulario";

    # Lo sacamos a pantalla
    print $agente->value('email'), "\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Modifica la base de datos pero sigue sin crear las cookies. Luego de ejecutar el script me tira el siguiente error:

CGI Error
The specified CGI application misbehaved by not returning a complete set of HTTP headers. The headers it did return are:
Use of uninitialized value in concatenation (.) or string at c:\inetpub\wwwroot\cgi-bin\registro_comunidad\login2cookies.pl line 9.


¿Cómo sigo?
zozo666
Perlero nuevo
Perlero nuevo
 
Mensajes: 139
Registrado: 2007-05-26 10:36 @483

Notapor explorer » 2007-07-27 03:50 @201

El modo de parsear la jarra de galletas es como pones, con la función parse.

El error que te sale es porque has ejecutado un cgi que no ha mandado las cabeceras propias de una respuesta HTTP. Falta que pongas un print header; o algo parecido al principio de la salida de información del cgi. Creo recordar que en el cgi que pusiste unos mensajes más arriba tenías algo como print "Content-type...". Pues eso es lo que falta en el cgi.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor zozo666 » 2007-07-27 14:09 @631

Probé de todas formas y no hubo caso... igual gracias a todos.
zozo666
Perlero nuevo
Perlero nuevo
 
Mensajes: 139
Registrado: 2007-05-26 10:36 @483

Anterior

Volver a Avanzado

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron