Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Login con Perl en phpbb2
Ir a página Anterior  1, 2, 3
 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Experto
Mensaje Jue Jul 26, 2007 12:45 pm
zozo666
Perlero Frecuente
Perlero Frecuente
Registrado: 26 May 2007
Mensajes: 137
Responder citando

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:

Perl:
#!/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;


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.
Mensaje Jue Jul 26, 2007 2:41 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4086
Ubicación: Valladolid, España
Responder citando

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

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.
Mensaje Jue Jul 26, 2007 3:18 pm
zozo666
Perlero Frecuente
Perlero Frecuente
Registrado: 26 May 2007
Mensajes: 137
Responder citando

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

Perl:
#!/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"
}


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:
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.

Ultima edición por zozo666 el Jue Jul 26, 2007 4:26 pm, editado 1 vez
Mensaje Jue Jul 26, 2007 5:53 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4086
Ubicación: Valladolid, España
Responder citando

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.
Mensaje Vie Jul 27, 2007 12:00 am
zozo666
Perlero Frecuente
Perlero Frecuente
Registrado: 26 May 2007
Mensajes: 137
Responder citando

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

Perl:
#!/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}
?

¿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:
Perl:
#!/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";
}


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

Cita:
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?
Mensaje Vie Jul 27, 2007 2:50 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4086
Ubicación: Valladolid, España
Responder citando

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.
Mensaje Vie Jul 27, 2007 1:09 pm
zozo666
Perlero Frecuente
Perlero Frecuente
Registrado: 26 May 2007
Mensajes: 137
Responder citando

Probé de todas formas y no hubo caso... igual gracias a todos.
Publicar nuevo tema   Responder al tema    Foros de discusión -> Experto Todas las horas son GMT - 6 Horas
Ir a página Anterior  1, 2, 3
Página 3 de 3



Powered by phpBB © 2001, 2005 phpBB Group