Laboratorio 7 - CGI

Embed Size (px)

Citation preview

  • 5/25/2018 Laboratorio 7 - CGI

    1/12

    Laboratorio 7: CGI

    Grupo Docente ATI / AL / JN

    1

    LLaabboorraattoorriioo##77::CCGGIICGI

    CGI, acrnimo de Common Gateway Interface, o interfaz de entrada comn, esun estndar establecido que permite a servidores HTTP delegar la generacinde contenidos a archivos ejecutables, completamente independientes de laarquitectura del servidor.

    El estndar CGI especifica las variables e informacin que son transferidas alejecutable, el cual, en general consta de datos provenientes del cliente, datosde la solicitud, datos relativos al servidor, entre otros. Luego de ejecutado elprograma encargado de la solicitud, el servidor HTTP captura la informacincontenida 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 losdesarrolladores de sitios web se mantenan en contacto mediante la lista decorreos www-talk y era aceptada la necesidad de poder comunicarse conejecutables de la consola de comandos. El equipo de la NCSA escribi laprimera especificacin, aunque ya no la mantienen. Los desarrolladores webadoptaron esta especificacin y se convirti en un estndar desde entonces.

    En Noviembre de 1997 un equipo dirigido por Ken Coar tom la definicinrealizada 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]

    Funcion amiento d e una interaccin CGI

    1. El servidor recibe una peticin cuyo URL corresponde con unaaplicacin 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 susrespectivas variables, en caso de existir alguna API los parmetros son

    analizados, se ejecuta la aplicacin, y lo producido de la salida estndares capturada por el servidor HTTP.

    http://en.wikipedia.org/wiki/National_Center_for_Supercomputing_Applicationshttp://en.wikipedia.org/wiki/National_Center_for_Supercomputing_Applicationshttp://en.wikipedia.org/wiki/National_Center_for_Supercomputing_Applications
  • 5/25/2018 Laboratorio 7 - CGI

    2/12

    Laboratorio 7: CGI

    Grupo Docente ATI / AL / JN

    2

    4. Al cumplir su funcin la aplicacin se genera contenido con un tipo MIMEespecfico (indicado por la aplicacin) la cual escribe en la salidaestndar.

    5. Al finalizar la ejecucin de la aplicacin, el servidor enva la informacinproducida junto con la propia al cliente.

    [2]

    Ap l icaciones 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. Esimportante tener ciertas consideraciones en cuenta al momento de tratar conaplicaciones CGI.

    Toda aplicacin CGI debe estar programada y tener la capacidad para procesarlos parmetros de peticin en la forma de pares nombre=valor. Algunoslenguajes poseen libreras para trabajar de forma mucho ms cmoda tanto laspeticiones como las respuestas.

    Existen ciertas caractersticas adicionalmente que se esperan de unaaplicacin CGI:

    1. Facilidad de manipulacin de Strings2. Facilidad de comunicacin inter-procesos3. Facilidad de invocar un Shell del sistema operativo

    4. Habilidad de acceder a variables de ambiente

    La petic in CGI

    Al ser realizada al servidor HTTP una peticin a un recurso CGI y estcompuesto de mltiples datos sumamente relevantes para la aplicacin.

    Uno de los contenidos son los datos de mensaje de peticin que sonproducidos cuando el mtodo de peticin es de tipo POST, y es accedido por laaplicacin al leer el archivo descriptor por el mtodo de entrada estndar, almenos que sea definido de forma contraria en la configuracin del servidor.

    Por otra parte, las meta-variablesson parmetros con nombre, que contienenla data acerca de la peticin enviada al servidor, cumplen la funcionalidad dellevar informacin desde el servidor hasta el programa CGI.

    Las variables se clasifican dependiendo de la informacin que presentan entres categoras:

    Variables relativas al servidor.

    Variables relativas a la conexin cliente-servidor Variables relativas a la peticin.

  • 5/25/2018 Laboratorio 7 - CGI

    3/12

    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 deinformacin.

    HTTP_HOST: La direccin IP de la mquina que alberga el servidorHTTP

    SCRIPT_NAME:El URL que representa la ruta al programa CGI

    SERVER_ADMIN:La direccin de correo de la persona que gestiona elservidor.

    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 asociadaspor el cliente al recurso consultado.

    HTTP_USER_AGENT: Esta variable contiene informacin relativa alcliente 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 alservidor HTTP. Si el URL del cliente requiere una autentificacin sealmacena en esta variable.

    CONTENT_LENGTH: El tamao, en nmero de bytes, del contenido dela informacin unida a la peticin.

    PATH_INFO: Este atributo representa la ruta que identifica el recurso alque accede el programa CGI. Esta ruta es una parte del URL querepresenta la peticin.

    PATH_TRANSLATED: Designa la ruta absoluta al que accede el

    servidor HTTP para ejecutar el programa CGI.

    Cons ideraciones de desarrol lo de apl icaciones

    CGI

    Las aplicaciones CGI se deben disear cuidadosamente para no escribirla lgica de presentacin mezclada con la de negocio, es decir, el cdigodel programa intercalado con la produccin de HTML haciendo difcil sucomprensin y mantenimiento.

    Cada programa CGI que se pone en marcha lo hace en un espacio dememoria propio, es decir el servidor crea un nuevo proceso. Por lo tanto,

  • 5/25/2018 Laboratorio 7 - CGI

    4/12

    Laboratorio 7: CGI

    Grupo Docente ATI / AL / JN

    4

    la ejecucin concurrente de una aplicacin CGI, generar procesos parasoportar la ejecucin. En casos donde no se contemple, se puedeafectar seriamente el desempeo del servidor, en casos puede ocurrir unabrazo mortal a nivel de gestin de procesos.

    Requiere gestin para escalar. Si crece repentinamente la cantidad depeticiones, el servidor web o los programas CGI no estn nativamentepreparados para hacer balanceo de carga.

    El acceso a otros programas o base de datos va comunicacininterprocesos o sockets TCP requiere una curva de aprendizaje ytienden a ser difciles de mantener y probar.

    Existen ciertos inconvenientes de eficiencia de conectividad conpersistencia, debido a que el Servidor Web tiene que cargar el programaCGI y conectar y desconectar con la base de datos cada vez que serecibe una peticin de este tipo.

    Mejo res prcticas

    En general, el inconveniente del uso de CGI es la seguridad del servidor, factorque debe ser tomado en cuenta con cuidado al momento de desplegar estasaplicaciones (siendo ms de infraestructura el inconveniente que de desarrolloen s mismo excepto por unas pocas consideraciones). Por este motivo esimportante tomar en cuenta ciertas prcticas:

    1. Ejecutar el servidor web como un usuario distinto del super-usuario. Estopara que en las aplicaciones CGI no se puedan ejecutar acciones comodicho usuario, las cuales, por lo general pueden ser sumamente dainasal servidor.

    2. Designar un nico directorio, o grupo de directorios, para elalmacenamiento de las aplicaciones CGI con privilegios limitados, depreferencia con acceso exclusivo al usuario super-usuario. Esto paraevitar que usuarios locales puedan editar, instalar, eliminar y en generalacceder 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 msinteligente posible los datos. Esto implica validar las entradas, validar elorigen de las entradas, validar que lo contenido en las entradas noafecte el funcionamiento de la aplicacin (sobre todo al manejar lapersistencia).

    4. Ser sumamente cuidadosos al transmitir datos a ejecutables de consolade sistema operativo, especialmente si provienen de la solicitud, dadoque 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

  • 5/25/2018 Laboratorio 7 - CGI

    5/12

    Laboratorio 7: CGI

    Grupo Docente ATI / AL / JN

    5

    desarrollador. Afortunadamente las libreras de input/output de archivosde muchos lenguajes poseen condiciones para manejar esto.

    6. Es importante definir una prioridad adecuada de procesos cuando nosencontramos trabajando en servidores donde la ejecucin de lasaplicaciones CGI no es dedicada para ellos. Esto para garantizar que losejecutables o los intrpretes que ejecuten el cdigo tengan los recursosnecesarios.

    7. Es importante manejar eficientemente las conexiones a las bases dedatos e inclusive los sistemas manejadores de bases de datos comocanal de acceso a la base de datos dado que en los ejecutables CGI lasmismas son accedidas con mucha frecuencia.

    Desp l iegue de apl icaciones CGI en Apache

    La configuracin de apache para desplegar aplicaciones CGI es bastantesimple, la forma de hacerlo es de preferencia mediante la directiva Directory.Por supuesto, el mdulo CGI debe estar habilitado, que por lo general es ciertoen 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 sigaenlaces simblicos exclusivamente si el archivo al cual el enlace referenciatiene el mismo dueo que el enlace simblico. Esto debido a que es unaprctica comn en algunas infraestructuras el colocar en la carpeta cg i losenlaces 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

    Lo que permite indicar que extensiones son aquellas que van a ser tratadascomo recursos CGI.

    Ejemplos con Shel l Scr iptMostrar un archivo:

    #!/bin/bash

    echo Content-type: text/htmlecho ""

    /bin/cat

  • 5/25/2018 Laboratorio 7 - CGI

    6/12

    Laboratorio 7: CGI

    Grupo Docente ATI / AL / JN

    6

    File Output: /var/www/text-file.txt

    EOM

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

    CAT

  • 5/25/2018 Laboratorio 7 - CGI

    7/12

    Laboratorio 7: CGI

    Grupo Docente ATI / AL / JN

    7

    Variables de entorno:

    #!/bin/bash

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

    echo ''echo ''

    echo ''echo 'Environment Variables'echo ''echo ''echo 'Environment Variables:'echo '

    '

    /usr/bin/env

    echo '

    'echo ''echo ''

    exit 0

    Procesando parmetros de entrada:

    #!/bin/bash

    echo "Content-type: text/html"

    echo ""

    echo ''echo ''echo ''echo 'Environment Variables'echo ''echo ''echo 'Parse Variables:'

    #Auxiliar para el internal file separator

  • 5/25/2018 Laboratorio 7 - CGI

    8/12

    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_STRINGArgs="$*"IFS="$OIFS"

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

    for i in $Args ;do#Cambiar el separador de archivo a =

    IFS="${OIFS}="set $iIFS="${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 herenamey) ARGY="`echo $2 | sed 's|%20| |g'`"

    ;;namez) ARGZ="${2/\// /}"

    ;;*) echo "Advertencia:"\

    "
    Variable no reconocida \'$1\' passed byFORM in QUERY_STRING."

    ;;esac

    done

    echo 'Parsed Values:'echo '
    'echo $ARGXecho '
    'echo $ARGYecho '
    'echo $ARGZ

    echo ''

    echo ''

  • 5/25/2018 Laboratorio 7 - CGI

    9/12

    Laboratorio 7: CGI

    Grupo Docente ATI / AL / JN

    9

    exit 0

    [3] [4]

    Act iv id ad de Shell Scr ipt

    Realizar UNscript que sea capaz de recibir una solicitud de escritura sobre unarchivo, especficamente, colocar lo que se pase por un parmetro al final deun archivo. Igualmente debe tener la capacidad de buscar sobre ese archivo eindicar el nmero de lnea donde se encontr lo buscado (Ayuda: comandogrep). Este script debe tener una visual donde se encuentre el formulario debsqueda, un rea para las respuestas de la bsqueda, un formulario paraagregar 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.rardonde se encuentra un ejemplo del usode CGI en python.

    El caso Perl

    Perl es un lenguaje interesante para el caso CGI, siendo un lenguajesumamente rico sintcticamente (siendo multi-paradigma, sumamente amplio

    en libreras y mdulos, influenciado por mltiples lenguajes con distintascaractersticas y basado en reglas lingsticas muy semejantes al lenguajenatural) 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 desarrolladocontinuamente desde entonces, hasta haber alcanzado, hoy en da su quintaversin.

    Perl es unlenguaje de propsito generaloriginalmente desarrollado para lamanipulacin detextoy que ahora es utilizado para un amplio rango de tareasincluyendoadministracin de sistemas,desarrollo web, programacin en red,desarrollo deGUIy ms.Se previ que fuera prctico (facilidad de uso, eficiente, completo) en lugar dehermoso (pequeo, elegante, mnimo). Sus principales caractersticas son quees fcil de usar, soporta tanto la programacin estructuradacomolaprogramacin orientada a objetosy laprogramacin funcional, tieneincorporado un poderoso sistema de procesamiento de texto y una enormecoleccin de mdulos disponibles. [5]

  • 5/25/2018 Laboratorio 7 - CGI

    10/12

    Laboratorio 7: CGI

    Grupo Docente ATI / AL / JN

    10

    La estructura completa de Perl deriva ampliamente del lenguaje C. Perl es unlenguaje imperativo, con variables, expresiones, asignaciones, bloques decdigo 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 legibilidad a lasintaxis. Igualmente, los sigilos permiten interpolar variables dentro de losstrings.

    El lenguaje integra las listas de Lisp, los hash de AWK y las expresionesregulares de sed. Todo esto simplifica y facilita todas las formas del anlisissintctico, manejo de texto y tareas de gestin de datos.

    En la versin 5 del lenguaje Perl, se aadieron caractersticas parasoportarestructuras de datoscomplejas,funciones de primer y un modelodeprogramacin orientada a objetos. stos incluyen referencias, paquetes yuna ejecucin demtodos basada en clasesy la introduccin de variables dembito lxico, que hizo ms fcil escribir cdigo robusto (junto con elpragmastrict). Una caracterstica principal introducida en Perl 5 fue la habilidadde empaquetar cdigo reutilizable comomdulos. Larry Wall indic msadelante que "la intencin del sistema de mdulos de Perl 5 era apoyar elcrecimiento de la cultura Perl en vez del ncleo de Perl"

    Todas las versiones de Perl hacen el tipificadoautomtico de datos y lagestinde memoria. El intrprete conoce el tipo y requerimientos de almacenamiento

    de cada objeto en el programa; reserva y libera espacio para ellos segn seanecesario. Las conversiones legales de tipo se hacen de forma automtica entiempo de ejecucin; las conversiones ilegales son consideradas erroresfatales. [6]

    En lo referido a CGI y generacin de contenidos web en general Perl esigualmente poderoso. Provee de capacidades de comunicarse mediante elestndar CGI por defecto adems de una amplia librera para facilitar el manejode las peticiones y las respuestas. Igualmente esta librera CGI es extendida aFast-CGI con escasa refactorizacin de cdigo.

    Para la generacin de distintos tipos de respuestas Perl se encuentra provistacon distintos analizadores y generadores sintcticos para mltiples tipos decontenidos que va desde simple HTML, XML, JSON, YAML hasta contenidosms elaborados como PDF, XML, entre otros.

    Ejemplos en Perl

    Acceda a los archivos indicados por el preparador para su estudio.

  • 5/25/2018 Laboratorio 7 - CGI

    11/12

    Laboratorio 7: CGI

    Grupo Docente ATI / AL / JN

    11

    Ac t ividad en Perl

    Escriba un script que reciba como parmetro un string xml y retorne el objetoJSON correspondiente al string xml. Tenga en cuenta caractersticas como quela 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.

    Ac t ividades a real izar pos t-labo rator io

    Debe realizar en cualquiera de los lenguajes propuestos (C/C++, Java CGI, sinservlets, Perl, Python, Shell Script, Ruby sin Rails) dos scripts que vienen arepresentar los script get y set utilizados en los laboratorios 4 y 6. En estaocasin los mismos no deben retornar o recibir XML, deben retornar JSON yrecibir algn formato a discrecin del desarrollador.

    Esta actividad contiene diversas tareas a considerar:

    1. Crear una base de datos PostgreSQL o MySQL que represente losobjetos del dominio de su actividad en funcin al laboratorio al cualpertenezca

    2. Analizar el formato con el cual se van a recibir los parmetros3. 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 errores5. Tener en cuenta la entrada y salida utilizando UTF-8

    Formato y estatuto s de entrega

    Debe entregar a lo sumo 4 das despus de su laboratorio el cdigo va correoelectrnico al correo [email protected] con el asunto [ATI I-2013] Post-Laboratorio 7. El archivo con las respuestas puede ser de los formatos deempaquetado o comprimido .zip, .tar, .rar, .tar, .tar.gz y el nombre del mismo

    debe seguir el formatodia_horainicio-horafin_cedula_post-laboratorio7.xxx.

    Por ejemplo Martes_900-1100_12345678_post-laboratorio7.tar

    Debe incluir dentro del archivo adems de los scripts el dump SQL de la basede 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

    http://search.cpan.org/~makamaka/JSON-2.61/lib/JSON.pmhttp://search.cpan.org/~makamaka/JSON-2.61/lib/JSON.pmhttp://search.cpan.org/~makamaka/JSON-2.61/lib/JSON.pmhttp://en.wikipedia.org/wiki/Common_Gateway_Interfacehttp://en.wikipedia.org/wiki/Common_Gateway_Interfacehttp://en.wikipedia.org/wiki/Common_Gateway_Interfacehttp://es.wikipedia.org/wiki/Common_Gateway_Interfacehttp://es.wikipedia.org/wiki/Common_Gateway_Interfacehttp://es.wikipedia.org/wiki/Common_Gateway_Interfacehttp://es.wikipedia.org/wiki/Common_Gateway_Interfacehttp://en.wikipedia.org/wiki/Common_Gateway_Interfacehttp://search.cpan.org/~makamaka/JSON-2.61/lib/JSON.pm
  • 5/25/2018 Laboratorio 7 - CGI

    12/12

    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

    http://www.yolinux.com/TUTORIALS/LinuxTutorialCgiShellScript.htmlhttp://www.yolinux.com/TUTORIALS/LinuxTutorialCgiShellScript.htmlhttp://www.yolinux.com/TUTORIALS/LinuxTutorialCgiShellScript.htmlhttp://www.yolinux.com/TUTORIALS/BashShellCgi.htmlhttp://www.yolinux.com/TUTORIALS/BashShellCgi.htmlhttp://www.yolinux.com/TUTORIALS/BashShellCgi.htmlhttp://perldoc.perl.org/perlintro.htmlhttp://perldoc.perl.org/perlintro.htmlhttp://perldoc.perl.org/perlintro.htmlhttp://es.wikipedia.org/wiki/Perlhttp://es.wikipedia.org/wiki/Perlhttp://es.wikipedia.org/wiki/Perlhttp://es.wikipedia.org/wiki/Perlhttp://perldoc.perl.org/perlintro.htmlhttp://www.yolinux.com/TUTORIALS/BashShellCgi.htmlhttp://www.yolinux.com/TUTORIALS/LinuxTutorialCgiShellScript.html