Diseño de Servicos Web © Francisco Rosales <[email protected]> Introducción Common Gateway Interface (Interfaz Público de Pasarela) ! El HTML era algo estático ! ! No satisfacía las necesidades de interactividad ! Francisco Rosales <[email protected]> ! 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. un servidor Web 1 Funcionamiento básico ! ! ! Ejemplo 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 ! ! ! Consulta desde el navegador web ! El usuario: ! ! Usos: ! 2 ! El servidor Web: ! El programa CGI: ! Contadores de accesos a las páginas Anuncios incrustados (banners) Buscadores etc. ! ! Common Gateway Interface Ejecuta (localmente) el CGI con los datos del formulario Accede a la BD y, con el resultado, produce un documento HTML El servidor Web: ! 3 Rellena un formulario HTML y lo envía La acción asociada es URL a un CGI Devuelve el documento, casi directamente, al navegador 4 1 Diseño de Servicos Web © Francisco Rosales <[email protected]> Ventajas e Inconvenientes ! Ventajas ! ! ! Mejora la seguridad de los usuarios ! 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 ! Todos los programas CGI suelen residir en un directorio especial del servidor: ! Simplifica la gestión de los servicios ! ! Precauciones de seguridad /cgi-bin Bajo control del webmaster El Administrador puede relajar esta restricción, pero no suele hacerse Dejar que cualquiera ejecute algo en el servidor, aunque lo hayamos escrito nosotros, no es muy seguro 5 Lenguajes de Programación ! ! ! ! Ejemplo: test.cgi No hay restricción Compilables: ! #!/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 estandard #.......................................... FIN 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 ! 6 Muy potente pero bastante complejo 7 Common Gateway Interface 8 2 Diseño de Servicos Web © Francisco Rosales <[email protected]> Para que funcione como CGI ! ¿Cómo invocar un CGI? I El servidor Web distingue un CGI de cualquier otro fichero convencional: ! ! Debe residir en /cgi-bin del sistema (o de la cuenta del usuario) ! Indicando su URL en el campo Location Al recorrer un hipervínculo ! Por su extensión: ! ! Directamente desde el Navegador Por su ubicación: ! ! ! El nombre del fichero debe tener extensión .cgi <A HREF="/cgi-bin/test.cgi" > Enlace al CGI de pruebas </A> Por sus permisos: ! Etiqueta A referida al URL Lectura y ejecución para todo el mundo 9 ¿Cómo invocar un CGI? II ! ¿Cómo invocar un CGI? III Como origen de una imagen ! ! 10 ! La salida del CGI debe ser de tipo imagen Es la forma de incrustar banners Como acción asociada a un formulario HTML ! ! <IMG SRC="/cgi-bin/banner" ALT="Inserte aquí su publicidad"> 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" > 11 Common Gateway Interface 12 3 Diseño de Servicos Web © Francisco Rosales <[email protected]> Paso de argumentos ! ! Codificación URL NO los reciben de la línea de mandatos Pueden indicarse en el URL ! http://.../cgi-bin/test.cgi/PATH_INFO?QUERY_STRING ! ! ! ! ! Al CGI le llegan como variables de entorno ! PATH_INFO Los espacios en blanco se sustituyen por el carácter '+' Otros caracteres especiales, por su valor hexadecimal con el prefijo '%' Texto a partir del nombre hasta la 1ª '?' Se suele usar para indicar caminos de búsqueda QUERY_STRING ! ! Texto desde la 1ª '?' hasta el final Este texto debe estar codificado 13 Método de invocación I ! ! ! Método de invocación II Todo formulario HTML debe indicar: ! ! La acción asociada: un programa CGI El método de invocación: GET o POST ! ! Como un conjunto de pares nombre=valor Donde nombre, será el del atributo NAME de cada etiqueta INPUT o SELECT Los pares llegarán uno detrás de otro, separados por el carácter '&' ! ! Esta variable de entorno indicará el método de invocación empleado Si fue GET ! Los datos llegarán (codificados) en la variable QUERY_STRING Si fue POST ! ! 15 Common Gateway Interface REQUEST_METHOD ! Los datos del formulario le llegarán al CGI: ! 14 Llegarán por la entrada estándar La variable CONTENT_LENGTH indicará el número de bytes de información 16 4 Diseño de Servicos Web © Francisco Rosales <[email protected]> Entorno de ejecución ! ! ! Identificación del cliente 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 ! REMOTE_ADDR ! REMOTE_HOST ! REMOTE_IDENT ! ! ! ! ! Dirección IP del cliente que invocó al CGI Dirección completa del cliente que invocó al CGI Si el sistema cliente lo permite identificar usuarios, indicará su nombre No deberá ser usado nunca como autenticación SCRIPT_NAME ! URL completo al programa CGI 17 Identificación del servidor ! ! ! Nombre del servidor como se indicó en el URL ! El número de puerto del servicio web ! Nombre y versión del software que implementa el servidor 19 Common Gateway Interface Versión del protocolo CGI implementado DOCUMENT_ROOT ! SERVER_SOFTWARE ! GATEWAY_INTERFACE ! SERVER_PORT ! ! Sobre la conexión I SERVER_NAME ! 18 Directorio raíz del servicio Web HTTP_HOST ! Nombre del servidor 20 5 Diseño de Servicos Web © Francisco Rosales <[email protected]> Sobre la conexión II ! HTTP_REFERER ! ! PATH_INFO ! ! Identificación del navegador usado por el cliente ! Cookie del usuario, si es que tiene ! HTTPS ! ! Es la concatenación de DOCUMENT_ROOT y PATH_INFO REQUEST_METHOD ! Activa si el CGI fue invocado a través de un servidor seguro Camino extra expresado en el URL del CGI PATH_TRANSLATED HTTP_COOKIE ! ! ! URL de la página desde la que se accedió al CGI HTTP_USER_AGENT ! ! Parámetros de entrada I Método de invocación utilizado QUERY_STRING ! Parámetros pasados a un CGI mediante GET 21 Parámetros de entrada II ! ! ! ¿Qué puede devolver? CONTENT_LENGTH ! ! 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 ! Todo CGI deberá emitir por la salida estándar su resultado ! CONTENT_TYPE ! 22 ! Un documento MIME completo O la localización del documento resultante 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 23 Common Gateway Interface 24 6 Diseño de Servicos Web © Francisco Rosales <[email protected]> Devolución de un documento ! ! ! Devolución de una dirección 1ª linea: Content-Type: tipo MIME 2ª línea: en blanco Resto: documento completo del tipo indicado ! ! ! 1ª línea: Location: URL local o remoto 2ª línea: en blanco ! text/plain, image/gif, etc. URL local: el propio servidor lo seguirá Location: /pub/WWW/ Content-Type: text/html <HEAD> <TITLE> Título del documento dinámico</TITLE> </HEAD> <BODY> .... </BODY> ! URL remoto: el cliente ha de seguirlo Location: http://www.w3.org/pub/WWW/ 25 CGI con salida NPH ! ! ! ! Direcciones de interés Non Process Header ! 26 ! 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: ....... ! ! 27 Common Gateway Interface 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/ 28 7