Perl - Programación CGI

¿Qué es CGI?

  • Una interfaz de puerta de enlace común, o CGI, es un conjunto de estándares que define cómo se intercambia la información entre el servidor web y un script personalizado.

  • Las especificaciones CGI las mantiene actualmente la NCSA y NCSA define que CGI es la siguiente:

  • La Interfaz de puerta de enlace común, o CGI, es un estándar para que los programas de puerta de enlace externos interactúen con servidores de información como los servidores HTTP.

  • La versión actual es CGI / 1.1 y CGI / 1.2 está en proceso.

Buscando en la web

Para comprender el concepto de CGI, veamos qué sucede cuando hacemos clic en un hipervínculo disponible en una página web para navegar por una página web o URL en particular.

  • Su navegador se comunica con el servidor web mediante el protocolo HTTP y solicita la URL, es decir, el nombre de archivo de la página web.

  • Web Server comprobará la URL y buscará el nombre de archivo solicitado. Si el servidor web encuentra ese archivo, lo envía de vuelta al navegador sin más ejecución; de lo contrario, envía un mensaje de error que indica que ha solicitado un archivo incorrecto.

  • El navegador web recibe la respuesta del servidor web y muestra el contenido del archivo recibido o un mensaje de error en caso de que no se encuentre el archivo.

Sin embargo, es posible configurar el servidor HTTP de tal manera que cada vez que se solicite un archivo en un directorio determinado, ese archivo no se devuelva; en su lugar, se ejecuta como un programa, y ​​lo que sea que el programa genere como resultado, se envía de vuelta para que lo muestre su navegador. Esto se puede hacer usando una funcionalidad especial disponible en el servidor web y se llamaCommon Gateway Interfaceo CGI y aquellos programas que son ejecutados por el servidor para producir el resultado final, se denominan scripts CGI. Estos programas CGI pueden ser un script PERL, un script de shell, un programa C o C ++, etc.

Diagrama de arquitectura CGI

Soporte y configuración del servidor web

Antes de continuar con la programación CGI, asegúrese de que su servidor web admita la funcionalidad CGI y esté configurado para manejar programas CGI. Todos los programas CGI a ejecutar por el servidor web se guardan en un directorio preconfigurado. Este directorio se denomina directorio CGI y por convención se denomina / cgi-bin. Por convención, los archivos CGI de Perl tendrán extensión como.cgi.

Primer programa CGI

Aquí hay un enlace simple que está vinculado a un script CGI llamado hello.cgi . Este archivo se ha guardado en/cgi-bin/directorio y tiene el siguiente contenido. Antes de ejecutar su programa CGI, asegúrese de haber cambiado el modo de archivo usandochmod 755 hello.cgi Comando UNIX.

#!/usr/bin/perl

print "Content-type:text/html\r\n\r\n";
print '<html>';
print '<head>';
print '<title>Hello Word - First CGI Program</title>';
print '</head>';
print '<body>';
print '<h2>Hello Word! This is my first CGI program</h2>';
print '</body>';
print '</html>';

1;

Ahora si haces clic hello.cgi el enlace luego la solicitud va al servidor web que busca hello.cgi en el directorio / cgi-bin, lo ejecuta y cualquier resultado que se genere, el servidor web envía ese resultado al navegador web, que es el siguiente:

Hello Word! This is my first CGI program

Este script hello.cgi es un script Perl simple que escribe su salida en el archivo STDOUT, es decir, la pantalla. Hay una característica importante y adicional disponible que es la primera línea que se imprimiráContent-type:text/html\r\n\r\n. Esta línea se envía de vuelta al navegador y especifica el tipo de contenido que se mostrará en la pantalla del navegador. Ahora debe haber comprendido el concepto básico de CGI y puede escribir muchos programas CGI complicados utilizando Perl. Este script puede interactuar con cualquier otro sistema de ejercicio también para intercambiar información como una base de datos, servicios web o cualquier otra interfaz compleja.

Comprensión del encabezado HTTP

La primera linea Content-type:text/html\r\n\r\nes una parte del encabezado HTTP, que se envía al navegador para que el navegador pueda comprender el contenido entrante del lado del servidor. Todo el encabezado HTTP tendrá la siguiente forma:

HTTP Field Name: Field Content

Por ejemplo:

Content-type:text/html\r\n\r\n

Hay algunos otros encabezados HTTP importantes, que utilizará con frecuencia en su programación CGI.

No Señor. Encabezado y descripción
1

Content-type: String

Una cadena MIME que define el formato del contenido que se devuelve. El ejemplo es Content-type: text / html

2

Expires: Date String

La fecha en que la información deja de ser válida. El navegador debe utilizarlo para decidir cuándo es necesario actualizar una página. Una cadena de fecha válida debe tener el formato 01 de enero de 1998 12:00:00 GMT.

3

Location: URL String

La URL que se debe devolver en lugar de la URL solicitada. Puede utilizar este archivo para redirigir una solicitud a cualquier otra ubicación.

4

Last-modified: String

La fecha de la última modificación del archivo.

5

Content-length: String

La longitud, en bytes, de los datos que se devuelven. El navegador usa este valor para informar el tiempo estimado de descarga de un archivo.

6

Set-Cookie: String

Establecer la cookie pasada a través de la cadena

Variables de entorno CGI

Todo el programa CGI tendrá acceso a las siguientes variables de entorno. Estas variables juegan un papel importante al escribir cualquier programa CGI.

No Señor. Nombres y descripción de variables
1

CONTENT_TYPE

El tipo de datos del contenido. Se utiliza cuando el cliente envía contenido adjunto al servidor. Por ejemplo, carga de archivos, etc.

2

CONTENT_LENGTH

La longitud de la información de la consulta. Está disponible solo para solicitudes POST

3

HTTP_COOKIE

Devuelve las cookies configuradas en forma de par clave y valor.

4

HTTP_USER_AGENT

El campo de encabezado de solicitud de agente de usuario contiene información sobre el agente de usuario que origina la solicitud. Su nombre del navegador web.

5

PATH_INFO

La ruta del script CGI.

6

QUERY_STRING

La información codificada en URL que se envía con la solicitud del método GET.

7

REMOTE_ADDR

La dirección IP del host remoto que realiza la solicitud. Esto puede ser útil para iniciar sesión o con fines de autenticación.

8

REMOTE_HOST

El nombre completo del host que realiza la solicitud. Si esta información no está disponible, REMOTE_ADDR se puede utilizar para obtener la dirección de infrarrojos.

9

REQUEST_METHOD

El método utilizado para realizar la solicitud. Los métodos más comunes son GET y POST.

10

SCRIPT_FILENAME

La ruta completa al script CGI.

11

SCRIPT_NAME

El nombre del script CGI.

12

SERVER_NAME

El nombre de host o la dirección IP del servidor.

13

SERVER_SOFTWARE

El nombre y la versión del software que ejecuta el servidor.

Aquí hay un pequeño programa CGI para enumerar todas las variables CGI admitidas por su servidor web. Haga clic en este enlace para ver el resultado Obtener entorno

#!/usr/bin/perl

print "Content-type: text/html\n\n";
print "<font size=+1>Environment</font>\n";
foreach (sort keys %ENV) {
   print "<b>$_</b>: $ENV{$_}<br>\n";
}

1;

¿Abrir un cuadro de diálogo "Descarga de archivos"?

En algún momento se desea que desee dar una opción en la que un usuario haga clic en un enlace y aparecerá un cuadro de diálogo "Descarga de archivo" para el usuario en lugar de mostrar el contenido real. Esto es muy fácil y se logrará a través del encabezado HTTP.

Este encabezado HTTP será diferente del encabezado mencionado en la sección anterior. Por ejemplo, si quiere hacer unFileName archivo descargable desde un enlace determinado, entonces su sintaxis será la siguiente:

#!/usr/bin/perl

# HTTP Header
print "Content-Type:application/octet-stream; name = \"FileName\"\r\n";
print "Content-Disposition: attachment; filename = \"FileName\"\r\n\n";

# Actual File Content will go hear.
open( FILE, "<FileName" );
while(read(FILE, $buffer, 100) ) {
   print("$buffer");
}

Métodos GET y POST

Debe haberse encontrado con muchas situaciones en las que necesita pasar información de su navegador al servidor web y, en última instancia, a su Programa CGI que maneja sus solicitudes. Con mayor frecuencia, el navegador utiliza dos métodos para pasar esta información al servidor web. Estos métodos sonGET Método y POSTMétodo. Vamos a comprobarlos uno por uno.

Pasar información usando el método GET

El método GET envía la información del usuario codificada adjunta a la URL de la página. La página y la información codificada están separadas por? personaje de la siguiente manera:

http://www.test.com/cgi-bin/hello.cgi?key1=value1&key2=value2

El método GET es el método predeterminado para pasar información desde un navegador al servidor web y produce una cadena larga que aparece en el cuadro Ubicación: de su navegador. Nunca debe usar el método GET si tiene una contraseña u otra información confidencial para pasar al servidor. El método GET tiene una limitación de tamaño: solo se pueden pasar 1024 caracteres en una cadena de solicitud.

Esta información se pasa usando QUERY_STRING encabezado y será accesible en su programa CGI a través de la variable de entorno QUERY_STRING que puede analizar y usar en su programa CGI.

Puede pasar información simplemente concatenando pares de clave y valor junto con cualquier URL o puede usar etiquetas HTML <FORM> para pasar información usando el método GET.

Ejemplo de URL simple: método Get

Aquí hay una URL simple que pasará dos valores al programa hello_get.cgi usando el método GET.

A continuación es hello_get.cgi script para manejar la entrada proporcionada por el navegador web.

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "GET") {
   $buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$first_name = $FORM{first_name};
$last_name  = $FORM{last_name};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Hello - Second CGI Program</title>";
print "</head>";
print "<body>";
print "<h2>Hello $first_name $last_name - Second CGI Program</h2>";
print "</body>";
print "</html>";

1;

Ejemplo de FORM simple: método GET

Aquí hay un ejemplo simple, que pasa dos valores usando el FORMULARIO HTML y el botón de envío. Vamos a utilizar el mismo script CGI hello_get.cgi para manejar esta entrada.

<FORM action = "/cgi-bin/hello_get.cgi" method = "GET">
First Name: <input type = "text" name = "first_name">  <br>

Last Name: <input type = "text" name = "last_name">
<input type = "submit" value = "Submit">
</FORM>

Aquí está la salida real de la codificación del formulario anterior. Ahora puede ingresar el nombre y apellido y luego hacer clic en el botón enviar para ver el resultado.

Pasando información usando el método POST

Un método más confiable para pasar información a un programa CGI es el POSTmétodo. Esto empaqueta la información exactamente de la misma manera que los métodos GET, pero en lugar de enviarla como una cadena de texto después de una?en la URL, lo envía como un mensaje separado como parte del encabezado HTTP. El servidor web proporciona este mensaje al script CGI en forma de entrada estándar.

A continuación se muestra el modificado hello_post.cgiscript para manejar la entrada proporcionada por el navegador web. Este script manejará el método GET y POST.

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") {
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
   $buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$first_name = $FORM{first_name};
$last_name  = $FORM{last_name};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Hello - Second CGI Program</title>";
print "</head>";
print "<body>";
print "<h2>Hello $first_name $last_name - Second CGI Program</h2>";
print "</body>";
print "</html>";

1;

Tomemos de nuevo el mismo ejemplo que el anterior, que pasa dos valores usando HTML FORM y el botón enviar. Vamos a utilizar el script CGI hello_post.cgi para manejar esta entrada.

<FORM action = "/cgi-bin/hello_post.cgi" method = "POST">
First Name: <input type = "text" name = "first_name">  <br>

Last Name: <input type = "text" name = "last_name">

<input type = "submit" value = "Submit">
</FORM>

Aquí está el resultado real de la codificación del formulario anterior, ingrese el nombre y apellido y luego haga clic en el botón Enviar para ver el resultado.

Pasar datos de casilla de verificación al programa CGI

Las casillas de verificación se utilizan cuando se requiere seleccionar más de una opción. A continuación, se muestra un código HTML de ejemplo para un formulario con dos casillas de verificación.

<form action = "/cgi-bin/checkbox.cgi" method = "POST" target = "_blank">
<input type = "checkbox" name = "maths" value = "on"> Maths
<input type = "checkbox" name = "physics" value = "on"> Physics
<input type = "submit" value = "Select Subject">
</form>

El resultado de este código es el siguiente formulario:

A continuación es checkbox.cgi script para manejar la entrada proporcionada por el navegador web para el botón de opción.

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") {
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
   $buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
if( $FORM{maths} ) {
   $maths_flag ="ON";
} else {
   $maths_flag ="OFF";
}
if( $FORM{physics} ) {
   $physics_flag ="ON";
} else {
   $physics_flag ="OFF";
}

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Checkbox - Third CGI Program</title>";
print "</head>";
print "<body>";
print "<h2> CheckBox Maths is : $maths_flag</h2>";
print "<h2> CheckBox Physics is : $physics_flag</h2>";
print "</body>";
print "</html>";

1;

Pasar datos de botones de radio al programa CGI

Los botones de opción se utilizan cuando solo se requiere seleccionar una opción. Aquí hay un código HTML de ejemplo para un formulario con dos botones de opción:

<form action = "/cgi-bin/radiobutton.cgi" method = "POST" target = "_blank">
<input type = "radio" name = "subject" value = "maths"> Maths
<input type = "radio" name = "subject" value = "physics"> Physics
<input type = "submit" value = "Select Subject">
</form>

El resultado de este código es el siguiente formulario:

A continuación es radiobutton.cgi script para manejar la entrada proporcionada por el navegador web para el botón de opción.

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") {
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
   $buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$subject = $FORM{subject};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Radio - Fourth CGI Program</title>";
print "</head>";
print "<body>";
print "<h2> Selected Subject is $subject</h2>";
print "</body>";
print "</html>";

1;

Pasar datos de área de texto al programa CGI

Se utiliza un elemento de área de texto cuando se debe pasar texto de varias líneas al programa CGI. Aquí hay un código HTML de ejemplo para un formulario con un cuadro TEXTAREA:

<form action = "/cgi-bin/textarea.cgi" method = "POST" target = "_blank">
<textarea name = "textcontent" cols = 40 rows = 4>
Type your text here...
</textarea>
<input type = "submit" value = "Submit">
</form>

El resultado de este código es el siguiente formulario:

abajo esta el textarea.cgi script para manejar la entrada proporcionada por el navegador web.

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") {
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
   $buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$text_content = $FORM{textcontent};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Text Area - Fifth CGI Program</title>";
print "</head>";
print "<body>";
print "<h2> Entered Text Content is $text_content</h2>";
print "</body>";
print "</html>";

1;

Pasar datos del cuadro desplegable al programa CGI

Se usa un cuadro desplegable cuando tenemos muchas opciones disponibles pero solo se seleccionarán una o dos. Aquí hay un código HTML de ejemplo para un formulario con un cuadro desplegable

<form action = "/cgi-bin/dropdown.cgi" method = "POST" target = "_blank">
<select name = "dropdown">
<option value = "Maths" selected>Maths</option>
<option value = "Physics">Physics</option>
</select>
<input type = "submit" value = "Submit">
</form>

El resultado de este código es el siguiente formulario:

abajo esta el dropdown.cgi script para manejar la entrada proporcionada por el navegador web.

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") {
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
   $buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$subject = $FORM{dropdown};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Dropdown Box - Sixth CGI Program</title>";
print "</head>";
print "<body>";
print "<h2> Selected Subject is $subject</h2>";
print "</body>";
print "</html>";

1;

Uso de cookies en CGI

El protocolo HTTP es un protocolo sin estado. Pero para un sitio web comercial, se requiere mantener la información de la sesión entre diferentes páginas. Por ejemplo, el registro de un usuario finaliza después de transacciones que abarcan muchas páginas. Pero, ¿cómo mantener la información de la sesión del usuario en todas las páginas web?

En muchas situaciones, el uso de cookies es el método más eficiente para recordar y rastrear preferencias, compras, comisiones y otra información requerida para una mejor experiencia del visitante o estadísticas del sitio.

Cómo funciona

Su servidor envía algunos datos al navegador del visitante en forma de cookie. El navegador puede aceptar la cookie. Si es así, se almacena como un registro de texto sin formato en el disco duro del visitante. Ahora, cuando el visitante llega a otra página de su sitio, la cookie está disponible para su recuperación. Una vez recuperado, su servidor sabe / recuerda lo que se almacenó.

Las cookies son un registro de datos de texto sin formato de 5 campos de longitud variable:

  • Expires- La fecha de caducidad de la cookie. Si está en blanco, la cookie caducará cuando el visitante salga del navegador.

  • Domain - El nombre de dominio de su sitio.

  • Path- La ruta al directorio o página web que instaló la cookie. Esto puede estar en blanco si desea recuperar la cookie de cualquier directorio o página.

  • Secure- Si este campo contiene la palabra "seguro", la cookie solo se puede recuperar con un servidor seguro. Si este campo está en blanco, no existe tal restricción.

  • Name = Value - Las cookies se configuran y recuperan en forma de pares de clave y valor.

Configurar cookies

Es muy fácil enviar cookies al navegador. Estas cookies se enviarán junto con el encabezado HTTP. Suponiendo que desea establecer el ID de usuario y la contraseña como cookies. Entonces se hará de la siguiente manera:

#!/usr/bin/perl

print "Set-Cookie:UserID = XYZ;\n";
print "Set-Cookie:Password = XYZ123;\n";
print "Set-Cookie:Expires = Tuesday, 31-Dec-2007 23:12:40 GMT";\n";
print "Set-Cookie:Domain = www.tutorialspoint.com;\n";
print "Set-Cookie:Path = /perl;\n";
print "Content-type:text/html\r\n\r\n";
...........Rest of the HTML Content goes here....

Aquí usamos Set-CookieEncabezado HTTP para configurar cookies. Es opcional establecer atributos de cookies como Caducidad, Dominio y Ruta. Es importante tener en cuenta que las cookies se establecen antes de enviar línea mágica."Content-type:text/html\r\n\r\n.

Recuperando cookies

Es muy fácil recuperar todas las cookies configuradas. Las cookies se almacenan en la variable de entorno CGI HTTP_COOKIE y tendrán la siguiente forma.

key1 = value1;key2 = value2;key3 = value3....

A continuación, se muestra un ejemplo de cómo recuperar cookies.

#!/usr/bin/perl
$rcvd_cookies = $ENV{'HTTP_COOKIE'};
@cookies = split /;/, $rcvd_cookies;
foreach $cookie ( @cookies ) {
   ($key, $val) = split(/=/, $cookie); # splits on the first =.
   $key =~ s/^\s+//;
   $val =~ s/^\s+//;
   $key =~ s/\s+$//;
   $val =~ s/\s+$//;
   if( $key eq "UserID" ) {
      $user_id = $val;
   } elsif($key eq "Password") {
      $password = $val;
   }
}
print "User ID  = $user_id\n";
print "Password = $password\n";

Esto producirá el siguiente resultado, siempre que las cookies anteriores se hayan configurado antes de llamar al script de recuperación de cookies.

User ID = XYZ
Password = XYZ123

Módulos y bibliotecas CGI

Encontrará muchos módulos integrados en Internet que le brindan funciones directas para usar en su programa CGI. Los siguientes son los importantes una vez.