index.html -> script.php -> .../cgi-bin/script.perl

Imagen de duvelr

Forums: 

Hola gente!

Estoy tratando de "crear" un sistema de seguridad/autenticacion que consta de una pantalla (index.php) que pide nombre de usuario, password, y codigo de seguridad (CAPTCHA), cuando el usuario hace el "submit" pasa al script que confirma el codigo, (.codigo.php) despues esto pasa a .../cgi-bin/login.cgi para confirmar nombre de usuario y password!

Mi consulta es: index.php pasa los datos a .codigo.php ( < form action=".codigo.php" method="POST">) y de momento '.codigo.php' simplemente redirige ( header("Location: https://localhost/cgi-bin/login.cgi" ); ) Pero!!!! como hago que login.cgi (Un script en Perl) conozca los valores introducidos en index.php?

Gracias de antemano por cualquier comentario/critica/sugerencia

Editado para uniformar nombres de archivos!

html -> php -> perl

Imagen de acl

Puede que este equivocado, pues hace tiempo que no meto las manos en php ni html, pero por lo que nos cuentas, me pareceria que el unico lugar donde existen los valores del form es en codigo.php. El cgi nunca lograra verlos. La clave esta en darse cuenta que http es un protocolo en el que el servidor no conserva el estado del cliente y pasar de una pagina a otra son pedidos independientes.

Si quieres que el cgi de perl vea lo que se metio en el html, la pagina php debe reenviar los valores que recibio en un post al cgi de perl. Esto a mi modo de ver es peligroso y un desperdicio, porque los datos van de ida y vuelta DOS veces por la red.

Tal vez lo mejor es mantener una sesion en codigo.php, actualizar una base de gatos y segun eso el script de perl podria reaccionar.

Muchas gracias por la

Imagen de duvelr

Muchas gracias por la respuesta 'mastropiero'

Nada equivocado! En el primer parrafo descrives perfectamente (talvez mejor que yo) mi problema. Ahora como soluciones tenemos:

1. Reenviar los datos de alguna forma (no remendado por las razones senaladas por 'mastropiero');
2. una convinacion de sesiones+cookies!
3. la solucion de la "Base de gatos" ;) no me gusta creo que seria mas lento y peligroso que la primer opcion.

Pero ni en los sitios PHP, o Perl ni en repositorios de scripts (no he podido encontrar la forma correcta de preguntar a Google) encuentro un ejemplo de una sesion avierta en PHP para utilizar los datos en Perl!

De todas formas creo que are algun intento en esta direccion!

Gracias otra vez!

Como ya te contestaron en el

Imagen de deathUser

Como ya te contestaron en el post de más abajo, hay como hacerlo con una librería que maneje los métodos del protocolo HTTP otra librería es CURL, pero si te haces problema, puedes hacerlo usando el método GET, claro que sería peligroso usarlo para pasar datos como contraseñas ya que al usar GET, normalmente vez los valores de las variables pasadas en la barra de dirección del browser, pero este no es el caso, ya que quien llama es un script, y si el server está protegido no le veo mayor riesgo de seguridad, podrías intentar llamar al cgi de perl de esta manera:
cgi-perl.cgi?user=usuario&pass=password

Claro, si el script de perl acepta las peticiones con el método GET, si no lo hace, no te queda de otra que con CURL u otra librería similar...

bye
:)

Re: index.html -> script.php -> .../cgi-bin/script.perl

Duvelr,

Una sugerencia es utilizar una libreria para emular protocolo http como cliente. Existen muchas, aqui te adjunto un ejemplo de una libreria (http://www.phpclasses.org/httpclient) que use para hacer consultas a la base de datos del padron del TSE.

<?
...
$strCedula = $_POST['strCedula']; // Numero cedula consultar
$http=new http_class;
$http->timeout=0;
$http->data_timeout=0;
$http->debug=0;
$http->html_debug=1;
$http->user_agent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)';

$strURL = 'http://www.tse.gov.ec/LugarVotElec2006/direlec.aspx';
$error = $http->GetRequestArguments($strURL,$arguments);
$arguments["RequestMethod"]="POST";
$arguments["PostValues"] = array(
'__VIEWSTATE' => 'dDwtMTgwNzIzMjI0Mjs7PkmRiUzK6xbS+FjlkWG8RTSbZ5Pl',
'hdnCriterio' => 'C',
'dropTipo' => 'C',
'txtCriterio' => 'C.I:' . $strCedula,
'btnConsultar' => 'Consultar');
flush();
$error=$http->Open($arguments); flush();
$error=$http->SendRequest($arguments); flush();
$error=$http->ReadReplyHeaders($headers); flush();
for(;;)
{
$error=$http->ReadReplyBody($body,1000);
if($error!="" || strlen($body)==0) break;
$strResultado .= $body; // Resultado del requerimiento, POST en este caso
}
flush();
if (strlen($strResultado) == 0) {
return (array('errno'=>'7'));
}
... // Aqui viene el manejo del resultado devuelto por el servidor

Si esta libreria te resulta muy confusa existen muchas otras, incluso en el repositorio PEAR existe una.
Revisa este link para el cliente http del repositorio PEAR http://pear.php.net/package/HTTP_Client

Saludos,

Gracias por las respuestas!

Imagen de duvelr

Muchas gracias por las respuestas y sugerencias!

Pero lo que busco es algo mas (portable: no quisiera tener que pedir a algun admin que instale nuevas librerias), al final -no sin hechar un ojo en las soluciones recomendadas- he decidido pasar las tareas de ".../cgi-bin/login.cgi" al script que hace la conexion a la Db, el cual se encuentra un nivel superior sobre el directorio raiz; ya se que no es lo maximo en seguridad pero al menos es mejor que tenerlo en el directorio raiz (razon principal para intentar ponerlo en un cgi).