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