You are on page 1of 12

Laboratorio 7: CGI

Grupo Docente ATI / AL / JN


1
L La ab bo or ra at to or ri io o # #7 7: : C CG GI I
CGI
CGI, acrnimo de Common Gateway Interface, o interfaz de entrada comn, es
un estndar establecido que permite a servidores HTTP delegar la generacin
de contenidos a archivos ejecutables, completamente independientes de la
arquitectura del servidor.
El estndar CGI especifica las variables e informacin que son transferidas al
ejecutable, el cual, en general consta de datos provenientes del cliente, datos
de la solicitud, datos relativos al servidor, entre otros. Luego de ejecutado el
programa encargado de la solicitud, el servidor HTTP captura la informacin
contenida en la salida estndar generada por el programa la cual es devuelta
en la respuesta, se espera que esta sea de algn tipo MIME y que inclusive,
contenga los datos de la cabecera de la respuesta.

CGI es creado para responder a una necesidad particular a inicios de la WWW,
especficamente en 1993. Los desarrolladores de la WWW y los
desarrolladores de sitios web se mantenan en contacto mediante la lista de
correos www-talk y era aceptada la necesidad de poder comunicarse con
ejecutables de la consola de comandos. El equipo de la NCSA escribi la
primera especificacin, aunque ya no la mantienen. Los desarrolladores web
adoptaron esta especificacin y se convirti en un estndar desde entonces.
En Noviembre de 1997 un equipo dirigido por Ken Coar tom la definicin
realizada por la NCSA y la formalizaron y mejoraron, generando el RFC 3875
[http://www.ietf.org/rfc/rfc3875] que es el estndar CGI 1.1. [1]
Funcionamiento de una interaccin CGI
1. El servidor recibe una peticin cuyo URL corresponde con una
aplicacin CGI.
2. El servidor prepara el entorno para la ejecucin de la aplicacin.
3. Los parmetros son transferidos mediante la entrada estndar a la
aplicacin, el ejecutable obtiene acceso al entorno de ejecucin con sus
respectivas variables, en caso de existir alguna API los parmetros son
analizados, se ejecuta la aplicacin, y lo producido de la salida estndar
es capturada por el servidor HTTP.
Laboratorio 7: CGI
Grupo Docente ATI / AL / JN
2
4. Al cumplir su funcin la aplicacin se genera contenido con un tipo MIME
especfico (indicado por la aplicacin) la cual escribe en la salida
estndar.
5. Al finalizar la ejecucin de la aplicacin, el servidor enva la informacin
producida junto con la propia al cliente.
[2]
Aplicaciones CGI
Los archivos ejecutables invocados por el estndar CGI son de distintos tipos,
aplicaciones standalone, scripts del sistema operativo, programas de alto nivel,
libreras avanzadas, sistemas complejos interconectados, entre otros. Es
importante tener ciertas consideraciones en cuenta al momento de tratar con
aplicaciones CGI.
Toda aplicacin CGI debe estar programada y tener la capacidad para procesar
los parmetros de peticin en la forma de pares nombre=valor. Algunos
lenguajes poseen libreras para trabajar de forma mucho ms cmoda tanto las
peticiones como las respuestas.
Existen ciertas caractersticas adicionalmente que se esperan de una
aplicacin CGI:
1. Facilidad de manipulacin de Strings
2. Facilidad de comunicacin inter-procesos
3. Facilidad de invocar un Shell del sistema operativo
4. Habilidad de acceder a variables de ambiente
La peticin CGI
Al ser realizada al servidor HTTP una peticin a un recurso CGI y est
compuesto de mltiples datos sumamente relevantes para la aplicacin.
Uno de los contenidos son los datos de mensaje de peticin que son
producidos cuando el mtodo de peticin es de tipo POST, y es accedido por la
aplicacin al leer el archivo descriptor por el mtodo de entrada estndar, al
menos que sea definido de forma contraria en la configuracin del servidor.
Por otra parte, las meta-variables son parmetros con nombre, que contienen
la data acerca de la peticin enviada al servidor, cumplen la funcionalidad de
llevar informacin desde el servidor hasta el programa CGI.
Las variables se clasifican dependiendo de la informacin que presentan en
tres categoras:
Variables relativas al servidor.
Variables relativas a la conexin cliente-servidor
Variables relativas a la peticin.
Laboratorio 7: CGI
Grupo Docente ATI / AL / JN
3
Algunas variables relativas al servidor
DOCUMENT_ROOT: Directorio fsico que contiene el servidor HTTP
GATEWAY_INTERFACE: Versin del CGI soportada por el servidor de
informacin.
HTTP_HOST: La direccin IP de la mquina que alberga el servidor
HTTP
SCRIPT_NAME: El URL que representa la ruta al programa CGI
SERVER_ADMIN: La direccin de correo de la persona que gestiona el
servidor.
Algunas variables relativas a la conexin cliente-servidor.
HTTP_ACCEPT: Los tipos MIME soportados por el cliente.
HTTP_COOKIE: Esta variable contiene todas las propiedades asociadas
por el cliente al recurso consultado.
HTTP_USER_AGENT: Esta variable contiene informacin relativa al
cliente que efecta la peticin.
REQUEST_METHOD: Esta variable es especfica del servidor HTTP.
Contiene el mtodo utilizado en la peticin.
Algunas variables relativas a la peticin
AUTH_TYPE: Esta variable es especfica de la peticin hecha al
servidor HTTP. Si el URL del cliente requiere una autentificacin se
almacena en esta variable.
CONTENT_LENGTH: El tamao, en nmero de bytes, del contenido de
la informacin unida a la peticin.
PATH_INFO: Este atributo representa la ruta que identifica el recurso al
que accede el programa CGI. Esta ruta es una parte del URL que
representa la peticin.
PATH_TRANSLATED: Designa la ruta absoluta al que accede el
servidor HTTP para ejecutar el programa CGI.
Consideraciones de desarrollo de aplicaciones
CGI
Las aplicaciones CGI se deben disear cuidadosamente para no escribir
la lgica de presentacin mezclada con la de negocio, es decir, el cdigo
del programa intercalado con la produccin de HTML haciendo difcil su
comprensin y mantenimiento.
Cada programa CGI que se pone en marcha lo hace en un espacio de
memoria propio, es decir el servidor crea un nuevo proceso. Por lo tanto,
Laboratorio 7: CGI
Grupo Docente ATI / AL / JN
4
la ejecucin concurrente de una aplicacin CGI, generar procesos para
soportar la ejecucin. En casos donde no se contemple, se puede
afectar seriamente el desempeo del servidor, en casos puede ocurrir un
abrazo mortal a nivel de gestin de procesos.
Requiere gestin para escalar. Si crece repentinamente la cantidad de
peticiones, el servidor web o los programas CGI no estn nativamente
preparados para hacer balanceo de carga.
El acceso a otros programas o base de datos va comunicacin
interprocesos o sockets TCP requiere una curva de aprendizaje y
tienden a ser difciles de mantener y probar.
Existen ciertos inconvenientes de eficiencia de conectividad con
persistencia, debido a que el Servidor Web tiene que cargar el programa
CGI y conectar y desconectar con la base de datos cada vez que se
recibe una peticin de este tipo.
Mejores prcticas
En general, el inconveniente del uso de CGI es la seguridad del servidor, factor
que debe ser tomado en cuenta con cuidado al momento de desplegar estas
aplicaciones (siendo ms de infraestructura el inconveniente que de desarrollo
en s mismo excepto por unas pocas consideraciones). Por este motivo es
importante tomar en cuenta ciertas prcticas:
1. Ejecutar el servidor web como un usuario distinto del super-usuario. Esto
para que en las aplicaciones CGI no se puedan ejecutar acciones como
dicho usuario, las cuales, por lo general pueden ser sumamente dainas
al servidor.
2. Designar un nico directorio, o grupo de directorios, para el
almacenamiento de las aplicaciones CGI con privilegios limitados, de
preferencia con acceso exclusivo al usuario super-usuario. Esto para
evitar que usuarios locales puedan editar, instalar, eliminar y en general
acceder al directorio con capacidad de ejecutar CGI.
3. En general, como en cualquier tipo de programa que recibe parmetros
de agentes externos, es importante manejar de la manera ms
inteligente posible los datos. Esto implica validar las entradas, validar el
origen de las entradas, validar que lo contenido en las entradas no
afecte el funcionamiento de la aplicacin (sobre todo al manejar la
persistencia).
4. Ser sumamente cuidadosos al transmitir datos a ejecutables de consola
de sistema operativo, especialmente si provienen de la solicitud, dado
que los mismos pueden provocar la ejecucin de acciones no deseadas.
5. Ser cuidadosos con condiciones de concurrencia (en particular al
manejar archivos) dado que estos deben ser gestionados por parte del
Laboratorio 7: CGI
Grupo Docente ATI / AL / JN
5
desarrollador. Afortunadamente las libreras de input/output de archivos
de muchos lenguajes poseen condiciones para manejar esto.
6. Es importante definir una prioridad adecuada de procesos cuando nos
encontramos trabajando en servidores donde la ejecucin de las
aplicaciones CGI no es dedicada para ellos. Esto para garantizar que los
ejecutables o los intrpretes que ejecuten el cdigo tengan los recursos
necesarios.
7. Es importante manejar eficientemente las conexiones a las bases de
datos e inclusive los sistemas manejadores de bases de datos como
canal de acceso a la base de datos dado que en los ejecutables CGI las
mismas son accedidas con mucha frecuencia.
Despliegue de aplicaciones CGI en Apache
La configuracin de apache para desplegar aplicaciones CGI es bastante
simple, la forma de hacerlo es de preferencia mediante la directiva Directory.
Por supuesto, el mdulo CGI debe estar habilitado, que por lo general es cierto
en el caso de Apache.
Para habilitar dentro del directorio especificado el uso de CGI se debe colocar
Options +ExecCGI +SymLinksIfOwnerMatch
Esto permite indicarle al servidor que el directorio tiene permitido el uso de CGI.
Adicionalmente, SymLinksifOwnerMatch permite indicarle al servidor que siga
enlaces simblicos exclusivamente si el archivo al cual el enlace referencia
tiene el mismo dueo que el enlace simblico. Esto debido a que es una
prctica comn en algunas infraestructuras el colocar en la carpeta cgi los
enlaces simblicos a los ejecutables en lugar de los ejecutables en s mismos.
Adicionalmente, dentro del directorio especificado se debe colocar la directiva
AddHandler cgi-script <extensin_de_archivo>
Lo que permite indicar que extensiones son aquellas que van a ser tratadas
como recursos CGI.
Ejemplos con Shell Script
Mostrar un archivo:
#!/bin/bash

echo Content-type: text/html
echo ""

/bin/cat << EOM
<HTML>
<HEAD><TITLE>File Output: /var/www/text-file.txt </TITLE>
Laboratorio 7: CGI
Grupo Docente ATI / AL / JN
6
</HEAD>
<BODY bgcolor="#cccccc" text="#000000">
<HR SIZE=5>
<H1>File Output: /var/www/text-file.txt </H1>
<HR SIZE=5>
<P>
EOM

/bin/cat /var/www/text-file.txt

CAT << EOM
<P>
</BODY>
</HTML>
EOM
Ejecutando un comando:
#!/bin/bash

echo "Content-type: text/html"
echo ""

echo '<html>'
echo '<head>'
echo '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">'

PATH="/bin:/usr/bin:/usr/ucb:/usr/opt/bin"
export $PATH

echo '<title>System Uptime</title>'
echo '</head>'
echo '<body>'
echo '<h3>'

hostname

echo '</h3>'

uptime

echo '</body>'
echo '</html>'
exit 0

Laboratorio 7: CGI
Grupo Docente ATI / AL / JN
7



Variables de entorno:
#!/bin/bash

echo "Content-type: text/html"
echo ""

echo '<html>'
echo '<head>'
echo '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">'
echo '<title>Environment Variables</title>'
echo '</head>'
echo '<body>'
echo 'Environment Variables:'
echo '<p>'

/usr/bin/env

echo '</p>'
echo '</body>'
echo '</html>'

exit 0
Procesando parmetros de entrada:
#!/bin/bash

echo "Content-type: text/html"
echo ""

echo '<html>'
echo '<head>'
echo '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">'
echo '<title>Environment Variables</title>'
echo '</head>'
echo '<body>'
echo 'Parse Variables:'

#Auxiliar para el internal file separator
Laboratorio 7: CGI
Grupo Docente ATI / AL / JN
8
OIFS="$IFS"

#Cambiar el file separator a & y divide el QUERY_STRING en el ampersand.
IFS="${IFS}&"
set $QUERY_STRING
Args="$*"
IFS="$OIFS"

ARGX=""
ARGY=""
ARGZ=""

for i in $Args ;do
#Cambiar el separador de archivo a =
IFS="${OIFS}="
set $i
IFS="${OIFS}"
case $1 in
# Don't allow "/" changed to " ". Prevent hacker problems.
namex) ARGX="`echo $2 | sed 's|[\]||g' | sed 's|%20| |g'`"
;;
# Filter for "/" not applied here
namey) ARGY="`echo $2 | sed 's|%20| |g'`"
;;
namez) ARGZ="${2/\// /}"
;;
*) echo "<hr>Advertencia:"\
"<br>Variable no reconocida \'$1\' passed by
FORM in QUERY_STRING.<hr>"
;;
esac
done

echo 'Parsed Values:'
echo '<br>'
echo $ARGX
echo '<br>'
echo $ARGY
echo '<br>'
echo $ARGZ

echo '</body>'
echo '</html>'

Laboratorio 7: CGI
Grupo Docente ATI / AL / JN
9
exit 0
[3] [4]

Actividad de Shell Script
Realizar UN script que sea capaz de recibir una solicitud de escritura sobre un
archivo, especficamente, colocar lo que se pase por un parmetro al final de
un archivo. Igualmente debe tener la capacidad de buscar sobre ese archivo e
indicar el nmero de lnea donde se encontr lo buscado (Ayuda: comando
grep). Este script debe tener una visual donde se encuentre el formulario de
bsqueda, un rea para las respuestas de la bsqueda, un formulario para
agregar la lnea deseada y debe notificar cuando sea agregada.
Dispone de 20 minutos para realizar este archivo.
Ejemplo en Python
Observar el cdigo CGI en python3.rar donde se encuentra un ejemplo del uso
de CGI en python.
El caso Perl
Perl es un lenguaje interesante para el caso CGI, siendo un lenguaje
sumamente rico sintcticamente (siendo multi-paradigma, sumamente amplio
en libreras y mdulos, influenciado por mltiples lenguajes con distintas
caractersticas y basado en reglas lingsticas muy semejantes al lenguaje
natural) y con mltiples funciones para facilitar el manejo de textos
(particularmente el ya diversificado modelo de expresiones regulares de Perl).
El lenguaje fue diseado por Larry Wall en 1987, siendo desarrollado
continuamente desde entonces, hasta haber alcanzado, hoy en da su quinta
versin.
Perl es un lenguaje de propsito general originalmente desarrollado para la
manipulacin de texto y que ahora es utilizado para un amplio rango de tareas
incluyendo administracin de sistemas, desarrollo web, programacin en red,
desarrollo de GUI y ms.
Se previ que fuera prctico (facilidad de uso, eficiente, completo) en lugar de
hermoso (pequeo, elegante, mnimo). Sus principales caractersticas son que
es fcil de usar, soporta tanto la programacin estructurada como
la programacin orientada a objetos y la programacin funcional, tiene
incorporado un poderoso sistema de procesamiento de texto y una enorme
coleccin de mdulos disponibles. [5]
Laboratorio 7: CGI
Grupo Docente ATI / AL / JN
10
La estructura completa de Perl deriva ampliamente del lenguaje C. Perl es un
lenguaje imperativo, con variables, expresiones, asignaciones, bloques de
cdigo delimitados por llaves, estructuras de control y subrutinas.
Perl toma ciertas caractersticas de la programacin Shell, como el uso de
sigilos para distinguir las variables, dando mucha ms riqueza y legibili dad a la
sintaxis. Igualmente, los sigilos permiten interpolar variables dentro de los
strings.
El lenguaje integra las listas de Lisp, los hash de AWK y las expresiones
regulares de sed. Todo esto simplifica y facilita todas las formas del anlisis
sintctico, manejo de texto y tareas de gestin de datos.
En la versin 5 del lenguaje Perl, se aadieron caractersticas para
soportar estructuras de datos complejas, funciones de primer y un modelo
de programacin orientada a objetos. stos incluyen referencias, paquetes y
una ejecucin de mtodos basada en clases y la introduccin de variables de
mbito lxico, que hizo ms fcil escribir cdigo robusto (junto con el
pragma strict). Una caracterstica principal introducida en Perl 5 fue la habilidad
de empaquetar cdigo reutilizable como mdulos. Larry Wall indic ms
adelante que "la intencin del sistema de mdulos de Perl 5 era apoyar el
crecimiento de la cultura Perl en vez del ncleo de Perl"
Todas las versiones de Perl hacen el tipificado automtico de datos y la gestin
de memoria. El intrprete conoce el tipo y requerimientos de almacenamiento
de cada objeto en el programa; reserva y libera espacio para ellos segn sea
necesario. Las conversiones legales de tipo se hacen de forma automtica en
tiempo de ejecucin; las conversiones ilegales son consideradas errores
fatales. [6]
En lo referido a CGI y generacin de contenidos web en general Perl es
igualmente poderoso. Provee de capacidades de comunicarse mediante el
estndar CGI por defecto adems de una amplia librera para facilitar el manejo
de las peticiones y las respuestas. Igualmente esta librera CGI es extendida a
Fast-CGI con escasa refactorizacin de cdigo.
Para la generacin de distintos tipos de respuestas Perl se encuentra provista
con distintos analizadores y generadores sintcticos para mltiples tipos de
contenidos que va desde simple HTML, XML, JSON, YAML hasta contenidos
ms elaborados como PDF, XML, entre otros.
Ejemplos en Perl
Acceda a los archivos indicados por el preparador para su estudio.
Laboratorio 7: CGI
Grupo Docente ATI / AL / JN
11
Actividad en Perl
Escriba un script que reciba como parmetro un string xml y retorne el objeto
JSON correspondiente al string xml. Tenga en cuenta caractersticas como que
la codificacin es UTF-8 y el tipo mime correcto de la salida.
Ayuda: http://search.cpan.org/~makamaka/JSON-2.61/lib/JSON.pm
Dispone de 30 minutos para realizar esta actividad.

Actividades a realizar post-laboratorio
Debe realizar en cualquiera de los lenguajes propuestos (C/C++, Java CGI, sin
servlets, Perl, Python, Shell Script, Ruby sin Rails) dos scripts que vienen a
representar los script get y set utilizados en los laboratorios 4 y 6. En esta
ocasin los mismos no deben retornar o recibir XML, deben retornar JSON y
recibir algn formato a discrecin del desarrollador.
Esta actividad contiene diversas tareas a considerar:
1. Crear una base de datos PostgreSQL o MySQL que represente los
objetos del dominio de su actividad en funcin al laboratorio al cual
pertenezca
2. Analizar el formato con el cual se van a recibir los parmetros
3. Realizar los cdigos con persistencia (No asignar el host al cual conecta
por motivos de correccin)
4. Validar la entrada de datos y la representacin de los errores
5. Tener en cuenta la entrada y salida utilizando UTF-8
Formato y estatutos de entrega
Debe entregar a lo sumo 4 das despus de su laboratorio el cdigo va correo
electrnico al correo negrettijuan@gmail.com con el asunto [ATI I-2013] Post-
Laboratorio 7. El archivo con las respuestas puede ser de los formatos de
empaquetado o comprimido .zip, .tar, .rar, .tar, .tar.gz y el nombre del mismo
debe seguir el formato
dia_horainicio-horafin_cedula_post-laboratorio7.xxx.<extensin del formato>
Por ejemplo Martes_900-1100_12345678_post-laboratorio7.tar
Debe incluir dentro del archivo adems de los scripts el dump SQL de la base
de datos elaborada, cuidando que no asigne propietarios.
Referencias
[1] http://en.wikipedia.org/wiki/Common_Gateway_Interface
[2] http://es.wikipedia.org/wiki/Common_Gateway_Interface
Laboratorio 7: CGI
Grupo Docente ATI / AL / JN
12
[3] http://www.yolinux.com/TUTORIALS/LinuxTutorialCgiShellScript.html
[4] http://www.yolinux.com/TUTORIALS/BashShellCgi.html
[5] http://perldoc.perl.org/perlintro.html
[6] http://es.wikipedia.org/wiki/Perl

You might also like