• Publicidad

Envío de hash con método POST

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Envío de hash con método POST

Notapor BigBear » 2011-06-20 19:28 @853

Hola, estoy haciendo un script que genera palabras para formularios POST.
El problema es que los genera en una variable normal. Un ejemplo de cómo
queda es así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!usr/bin/perl
  2.  
  3. use LWP::UserAgent;
  4.  
  5. my $nave = LWP::UserAgent->new;
  6. $nave->agent("Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1.12) Gecko/20080201Firefox/2.0.0.12");
  7. $nave->timeout(5);
  8.  
  9. my $tengo = qq({"probar" => "test","probarx" => "et","control" => "mandar"});
  10. print $nave->post("http://localhost/test/a.php",$tengo)->content;
  11.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Soy consciente de que sacando qq() el método POST lo va hacer bien pero
el generador que estoy haciendo deja así los datos porque cuando printeo se muestra
tal cual está encerrado en qq() pero en realidad no usa qq() porque es una demostración de que no puedo convertir la variable. Lo que necesito es: cómo puedo transformar dicha variable para que el método POST lo vea como un hash.
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Publicidad

Re: Envío de hash con método POST

Notapor explorer » 2011-06-21 02:33 @148

Por medio del POST, sí que puedes enviar una representación binaria de una estructura de datos... pero... es casi imposible que esa estructura sea regenerada en el receptor, ya que no coincidirán las direcciones virtuales de las referencias de las diversas estructuras con las estructuras de referencias de las direcciones virtuales del receptor (solo tienes que ejecutar varias veces un programa que vuelque un hash para comprobar que la dirección que hay dentro de HASH(...), cambia).

Lo que se hace en estos casos, es serializar la estructura, para que sea fácil su transporte y fácil su reconstrucción en destino.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Envío de hash con método POST

Notapor BigBear » 2011-06-21 08:38 @401

Pero entonces , ¿ cómo soluciono esta pesadilla ?

¿ No hay otra forma de enviar los datos con post para que mi variable sea aceptada ?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Envío de hash con método POST

Notapor kidd » 2011-06-21 08:46 @407

No entiendo muy bien el problema, teniendo tu hash:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
{"probar" => "test","probarx" => "et","control" => "mandar"}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Quiéres enviar el hash tal cual por medio de post para que el receptor lo reciba como una variable hash? ¿O quiéres enviarlo de manera que cada llave del hash sea representado como un campo en el POST (probar=test&probarx=et&control=mandar)?
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Re: Envío de hash con método POST

Notapor BigBear » 2011-06-21 09:04 @419

Un poco de la primera pero mas de de la segunda pregunta.
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Envío de hash con método POST

Notapor kidd » 2011-06-21 09:13 @426

Bueno si quieres enviar el hash como está, tal y como te decía Joaquin, tienes que serializarlo, para ello tienes varias opciones, por ejemplo JSON, con lo que harías:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use LWP::UserAgent;
use JSON;
 
my $nave = LWP::UserAgent->new;
$nave->agent("Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1.12) Gecko/20080201Firefox/2.0.0.12");
$nave->timeout(5);
 
my $tengo = to_json({"probar" => "test","probarx" => "et","control" => "mandar"});
print $nave->post("http://localhost/test/a.cgi",hash=>$tengo)->content;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y luego en a.cgi:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use CGI;
use JSON;

my $cgi = new CGI;

my $hash = from_json( $cgi->param('hash') );

print $hash->{'probar'}; #test
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ahora, si deseas enviar cada llave como un campo, es simple cuestión de modificar un poco tu código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use LWP::UserAgent;
 
my $nave = LWP::UserAgent->new;
$nave->agent("Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1.12) Gecko/20080201Firefox/2.0.0.12");
$nave->timeout(5);
 
my %tengo = ("probar" => "test","probarx" => "et","control" => "mandar");
print $nave->post("http://localhost/test/a.php",%tengo)->content;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Re: Envío de hash con método POST

Notapor BigBear » 2011-06-21 09:34 @440

Perdón por tanto lío, pero necesito una solución que utilice los módulos
por defecto.

El código en realidad es este
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!usr/bin/perl
  2. #By Doddy HAckman
  3.  
  4. use LWP::UserAgent;
  5. use HTML::Form;
  6.  
  7. my $nave = LWP::UserAgent->new;
  8. $nave->agent(
  9.     "Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1.12) Gecko/20080201Firefox/2.0.0.12"
  10. );
  11. $nave->timeout(5);
  12.  
  13. scan("http://localhost/test/a.php");
  14.  
  15. sub scan {
  16.  
  17.     my $page = shift;
  18.  
  19.     my @strings = ( "yeah", "fuck" );
  20.     my @testar = HTML::Form->parse( toma($page), "/" );
  21.     my @botones_names;
  22.     my @botones_values;
  23.  
  24.     my $valor = "doddyhackman";
  25.  
  26.     for my $test (@testar) {
  27.         if ( $test->method eq "POST" ) {
  28.             my @inputs = $test->inputs;
  29.             for my $in (@inputs) {
  30.                 if ( $in->type eq "submit" ) {
  31.                     if ( $in->name eq "" ) {
  32.                         push( @botones_names, "submit" );
  33.                     }
  34.                     push( @botones_names,  $in->name );
  35.                     push( @botones_values, $in->value );
  36.                 }
  37.                 else {
  38.                     $orden .= '"' . $in->name . '" => "' . $valor . '",';
  39.                 }
  40.             }
  41.             chop($orden);
  42.             for my $n ( 0 .. int(@botones_names) - 1 ) {
  43.                 my $partedos
  44.                     = ',"'
  45.                     . $botones_names[$n]
  46.                     . '" => "'
  47.                     . $botones_values[$n] . '"';
  48.                 my $final = $orden . $partedos;
  49.                 print tomar( $page, $final );
  50.             }
  51.         }
  52.         else {                         #Fin de metodo POST
  53.  
  54.             my @inputs = $test->inputs;
  55.             for my $in (@inputs) {
  56.                 if ( $in->type eq "submit" ) {
  57.                     if ( $in->name eq "" ) {
  58.                         push( @botones_names, "submit" );
  59.                     }
  60.                     push( @botones_names,  $in->name );
  61.                     push( @botones_values, $in->value );
  62.                 }
  63.                 else {
  64.                     $orden .= '' . $in->name . '=' . $valor . '&';
  65.                 }
  66.             }
  67.             chop($orden);
  68.             for my $n ( 0 .. int(@botones_names) - 1 ) {
  69.                 my $partedos
  70.                     = "&" . $botones_names[$n] . "=" . $botones_values[$n];
  71.                 my $final = $orden . $partedos;
  72.                 for my $strin (@strings) {
  73.                     $final =~ s/doddyhackman/$strin/;
  74.                     print $page. "?" . $final . "\n";
  75.                 }
  76.  
  77.             }
  78.         }                              # Fin de metodo GET agregar ?
  79.     }                                  #Fin de bucle principal
  80.  
  81.     #{"query" => $_[0], "submit" => " Crack "}
  82.  
  83. }                                      # Fin de scan
  84.  
  85. sub toma {
  86.     return $nave->get( $_[0] )->content;
  87. }
  88.  
  89. sub tomar {
  90.     my ( $web, $var ) = @_;
  91.     return $nave->post( $web, [ %{$var} ] )->content;
  92. }
  93.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4



En realidad lo puse en una variable común porque después quería reemplazar los valores de
los inputs por cada palabra de un array.
Viendo el código solo me falta el método POST.

¿ No encuentran alguna solución ?
Última edición por explorer el 2011-06-21 10:39 @485, editado 1 vez en total
Razón: Formatear el código con Perltidy. Faltas de ortografía.
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Envío de hash con método POST

Notapor explorer » 2011-06-21 11:12 @508

Los problemas que dicen "necesito una solución que utilice los módulos por defecto", me dan mucha pereza, porque eso indica que el programador no entiende lo que significa Perl. Con WWW::Mechanize se puede resolver un problema como el que planteas, en la tercera parte de las líneas que has escrito.

En cuanto a tu problema...

En la línea 91, el método post() necesita que el segundo argumento sea una referencia a un hash o un array, pero en realidad, estás haciendo una salvajada (convertir una cadena de caracteres que se ha construido en las líneas 38 a 48, en una referencia a un hash... y que además se lo pasas al método como una referencia a un array).

Lo que tienes que hacer es no usar una variable escalar, sino un array o un hash para guardar la información, y luego le pasas la referencia a esa variable al método post().

Las líneas 32, 34, 35, 38 y 41 a 48 se deben transformar en líneas que "construyan" ese hash o array.

Quizás te sea más fácil crear el array: solo tienes que guardar pares "nombre" / "valor" de lo que quieres enviar por el método POST.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Envío de hash con método POST

Notapor BigBear » 2011-06-21 11:27 @518

Perdón si me equivoco pero el orden del array que debería hacer debe quedar así

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. @valores = ("nombre/test","submit/boton");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Estoy seguro que no es así :oops:
Última edición por BigBear el 2011-06-21 11:43 @530, editado 1 vez en total
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Envío de hash con método POST

Notapor kidd » 2011-06-21 11:32 @522

Tiene razón Joaquín, tienes que construir un array o un hash, en vez de crear una cadena, lo que estás queriendo hacer es pasar una cadena al post() en vez de pasar correctamente un array o hash.
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron