Common Gateway Interface (Interfaz Público de Pasarela) Francisco Rosales © Francisco Rosales <[email protected]> <[email protected]> Diseño de Servicios Web Common Gateway Interface 1 Introducción La Web era de contenido estático No satisfacía las necesidades de interactividad Todo acceso a una hoja, daba el mismo resultado Documentos de contenido exclusivo para el acceso Se creó el Common Gateway Interface Un estándar que especifica como interconectar aplicaciones externas con servidores de información Ej. aplicación externa: Ej. servidor de información: © Francisco Rosales <[email protected]> Una consulta a BBDD Un servidor Web Diseño de Servicios Web Common Gateway Interface 2 Funcionamiento básico Cuando accedamos a un CGI: Será ejecutado en el servidor en ese instante La información dinámica que produzca será presentada como resultado del acceso Usos: Contadores de accesos a las páginas Anuncios incrustados (banners) Buscadores etc. © Francisco Rosales <[email protected]> Diseño de Servicios Web Common Gateway Interface 3 Ejemplo Consulta desde el navegador web El usuario: El servidor Web: Ejecuta (localmente) el CGI con los datos del formulario El programa CGI: Rellena un formulario HTML y lo envía La acción asociada es URL a un CGI Accede a la BD y, con el resultado, produce un documento HTML ad-hoc El servidor Web: Devuelve el documento, casi directamente, al navegador © Francisco Rosales <[email protected]> Diseño de Servicios Web Common Gateway Interface 4 Ventajas e Inconvenientes Ventajas Mejora la seguridad de los usuarios Simplifica la gestión de los servicios No tendrán que ejecutar programas extraños en su máquina Al estar centralizado, se eliminan los problemas de mantenimiento y distribución de las aplicaciones Inconvenientes Puede comprometer la seguridad del servidor Que se ejecute algo en el servidor, aunque lo hayamos escrito nosotros, no es muy seguro y carga el sistema © Francisco Rosales <[email protected]> Diseño de Servicios Web Common Gateway Interface 5 Precauciones de seguridad Todos los programas CGI suelen residir en un directorio especial del servidor: /cgi-bin Bajo control del webmaster El Administrador puede relajar esta restricción, pero no suele hacerse © Francisco Rosales <[email protected]> Diseño de Servicios Web Common Gateway Interface 6 Lenguajes de Programación No hay restricción Compilables: C, C++, Fortran, etc. El ejecutable deberá estar en /cgi-bin Interpretados: El script, directamente ejecutable, en /cgi-bin Es mucho más fácil depurar, modificar y mantener Se usa mucho perl Muy potente pero bastante complejo © Francisco Rosales <[email protected]> Diseño de Servicios Web Common Gateway Interface 7 Ejemplo: test.cgi #!/bin/sh echo "Content-type: text/plain" echo "" set -v ### Activa modo verbose del shell exec 2>&1 ### Dirige el error a la salida estd. echo "$0" #................. Nombre del mandato echo "$@" #........... Argumentos de invocación id #..................... Identidad del proceso pwd #............. Directorio actual de trabajo env #..................... Variables de entorno cat #....... Información en la entrada estándar #.......................................... FIN © Francisco Rosales <[email protected]> Diseño de Servicios Web Common Gateway Interface 8 Para que funcione como CGI El servidor Web distingue un CGI de cualquier otro fichero convencional: Por su ubicación: Por su extensión: Debe residir en /cgi-bin del sistema (o de la cuenta del usuario) El nombre del fichero debe tener extensión .cgi Por sus permisos: Ejecución (y lectura) para todo el mundo © Francisco Rosales <[email protected]> Diseño de Servicios Web Common Gateway Interface 9 ¿Cómo invocar un CGI? Directamente desde el Navegador I Indicando su URL en el campo Location Al recorrer un hipervínculo Etiqueta A referida al URL <A HREF="/cgi-bin/test.cgi" > Enlace al CGI de pruebas </A> © Francisco Rosales <[email protected]> Diseño de Servicios Web Common Gateway Interface 10 ¿Cómo invocar un CGI? II Como origen de una imagen La salida del CGI debe ser de tipo imagen Es la forma de incrustar banners <IMG SRC="/cgi-bin/banner" ALT="Inserte aquí su publicidad"> © Francisco Rosales <[email protected]> Diseño de Servicios Web Common Gateway Interface 11 ¿Cómo invocar un CGI? III Como acción asociada a un formulario HTML Es el uso más común de los CGI El método de invocación (GET o POST) establece la manera en que el CGI recibirá los parámetros <FORM ACTION="/cgi-bin/test.cgi" METHOD="GET" > © Francisco Rosales <[email protected]> Diseño de Servicios Web Common Gateway Interface 12 Paso de argumentos NO los reciben de la línea de mandatos Pueden indicarse en el URL http://.../cgi-bin/test.cgi/PATH_INFO?QUERY_STRING PATH_INFO Al CGI le llegan como variables de entorno Texto a partir del nombre hasta la 1ª '?' (No suele aparecer pero) puede usarse para indicar caminos de búsqueda QUERY_STRING Texto desde la 1ª '?' hasta el final Este texto debe estar codificado © Francisco Rosales <[email protected]> Diseño de Servicios Web Common Gateway Interface 13 Codificación URL Los espacios en blanco se sustituyen por el carácter '+' Otros caracteres especiales, por su valor hexadecimal con el prefijo '%' © Francisco Rosales <[email protected]> Diseño de Servicios Web Common Gateway Interface 14 Método de invocación Todo formulario HTML debe indicar: I La acción asociada: un programa CGI El método de invocación: GET o POST Los datos del formulario le llegarán al CGI: Como un conjunto de pares nombre=valor Donde nombre, será el del atributo NAME de cada etiqueta INPUT o SELECT del formulario Los pares llegarán uno detrás de otro, separados por el carácter '&' © Francisco Rosales <[email protected]> Diseño de Servicios Web Common Gateway Interface 15 Método de invocación REQUEST_METHOD Esta variable de entorno indicará el método de invocación empleado Si fue GET II Los datos llegarán (codificados) en la variable de entorno QUERY_STRING Si fue POST Llegarán por la entrada estándar La variable de entorno CONTENT_LENGTH indicará el número de bytes de información © Francisco Rosales <[email protected]> Diseño de Servicios Web Common Gateway Interface 16 Entorno de ejecución La especificación define unas variables que el servidor Web debe poner en el entorno de ejecución de los CGI Se escriben en mayúsculas Un valor nulo equivale a su no definición © Francisco Rosales <[email protected]> Diseño de Servicios Web Common Gateway Interface 17 Identificación del cliente REMOTE_ADDR REMOTE_HOST Dirección completa del cliente que invocó al CGI REMOTE_IDENT Dirección IP del cliente que invocó al CGI Si el sistema cliente permite identificar usuarios, indicará su nombre No deberá ser usado nunca como autenticación SCRIPT_NAME URL completo al programa CGI © Francisco Rosales <[email protected]> Diseño de Servicios Web Common Gateway Interface 18 Identificación del servidor SERVER_NAME SERVER_PORT Nombre del servidor como se indicó en el URL El número de puerto del servicio web SERVER_SOFTWARE Nombre y versión del software que implementa el servidor © Francisco Rosales <[email protected]> Diseño de Servicios Web Common Gateway Interface 19 Sobre la conexión GATEWAY_INTERFACE Versión del protocolo CGI implementado DOCUMENT_ROOT I Directorio raíz del servicio Web HTTP_HOST Nombre del servidor © Francisco Rosales <[email protected]> Diseño de Servicios Web Common Gateway Interface 20 Sobre la conexión HTTP_REFERER Identificación del navegador usado por el cliente HTTP_COOKIE URL de la página desde la que se accedió al CGI HTTP_USER_AGENT II Cookie del usuario, si es que tiene HTTPS Activa si el CGI fue invocado a través de un servidor seguro © Francisco Rosales <[email protected]> Diseño de Servicios Web Common Gateway Interface 21 Parámetros de entrada PATH_INFO Es la concatenación de DOCUMENT_ROOT y PATH_INFO REQUEST_METHOD Camino extra expresado en el URL del CGI PATH_TRANSLATED I Método de invocación utilizado QUERY_STRING Parámetros pasados a un CGI mediante GET © Francisco Rosales <[email protected]> Diseño de Servicios Web Common Gateway Interface 22 Parámetros de entrada CONTENT_LENGTH II Tamaño del la información presente en la entrada estándar o NULL Puede venir de un POST o de un PUT de HTTP CONTENT_TYPE Indica el tipo MIME de la información presente en la entrada estándar Si vale NULL, se deberá deducir el tipo, y si no se consigue se asumirá application/octet-stream © Francisco Rosales <[email protected]> Diseño de Servicios Web Common Gateway Interface 23 ¿Qué puede devolver? Todo CGI deberá emitir su resultado por la salida estándar Un documento MIME completo O la localización del documento resultante © Francisco Rosales <[email protected]> Diseño de Servicios Web Common Gateway Interface 24 Devolución de un documento 1ª linea: Content-Type: tipo MIME 2ª línea: en blanco Resto: documento completo del tipo indicado text/plain, image/gif, etc. Content-Type: text/html <HEAD> <TITLE> Título del documento dinámico </TITLE> </HEAD> <BODY> .... </BODY> © Francisco Rosales <[email protected]> Diseño de Servicios Web Common Gateway Interface 25 Devolución de una dirección 1ª línea: Location: URL local o remoto 2ª línea: en blanco URL local: el propio servidor lo seguirá Location: /pub/WWW/ URL remoto: el cliente ha de seguirlo Location: http://www.w3.org/pub/WWW/ © Francisco Rosales <[email protected]> Diseño de Servicios Web Common Gateway Interface 26 CGI con salida NPH Non Process Header Exige el prefijo nphEl servidor conecta CGI y cliente y no filtra El CGI toma control total de la conexión HTTP Debe incluir al menos una línea indicando el protocolo y el estado del acceso realizado HTTP/1.0 200 Todo fue bien Content-Type: ....... © Francisco Rosales <[email protected]> Diseño de Servicios Web Common Gateway Interface 27 Direcciones de interés The Common Gateway Interface http://hoohoo.ncsa.uiuc.edu/cgi/ CGI Made Really Easy http://www.jmarshall.com/easy/cgi/ The World Wide Web Security FAQ http://www.w3.org/Security/Faq/www-security-faq.html Multitud de referencias http://dir.yahoo.com/Computers_and_Internet/Internet/ World_Wide_Web/CGI___Common_Gateway_Interface/ Lista de enlaces relativos a CGIs http://users.erols.com/foxdm/cgi.htm CGI Programming 101 http://www.cgi101.com/class/ © Francisco Rosales <[email protected]> Diseño de Servicios Web Common Gateway Interface 28