© Francisco Rosales <[email protected]>
Diseño de Servicios Web Common Gateway Interface
1
Common Gateway Interface
(Interfaz Público de Pasarela)
Francisco Rosales<[email protected]>
© Francisco Rosales <[email protected]>
Diseño de Servicios Web Common Gateway Interface
2
Introducción El HTML era algo estático
Todo acceso a una hoja, daba el mismo resultado
No satisfacía las necesidades de interactividad 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
© Francisco Rosales <[email protected]>
Diseño de Servicios Web Common Gateway Interface
3
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
4
Ejemplo Consulta desde el navegador web
El usuario: Rellena un formulario HTML y lo envía La acción asociada es URL a un CGI
El servidor Web: Ejecuta (localmente) el CGI con los datos del formulario
El programa CGI: Accede a la BD y, con el resultado, produce un
documento HTML El servidor Web:
Devuelve el documento, casi directamente, al navegador
© Francisco Rosales <[email protected]>
Diseño de Servicios Web Common Gateway Interface
5
Ventajas e Inconvenientes Ventajas
Mejora la seguridad de los usuarios No tendrán que ejecutar programas extraños en su
máquina Simplifica la gestión de los servicios
Al estar centralizado, se eliminan los problemas de mantenimiento y distribución de las aplicaciones
Inconvenientes Puede comprometer la seguridad del servidor
Dejar que cualquiera ejecute algo en el servidor, aunque lo hayamos escrito nosotros, no es muy seguro
© Francisco Rosales <[email protected]>
Diseño de Servicios Web Common Gateway Interface
6
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
7
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
8
#!/bin/shecho "Content-type: text/plain"echo ""set -v ### Activa modo verbose del shellexec 2>&1 ### Dirige el error a la salida estd.echo "$0" #................. Nombre del mandatoecho "$@" #........... Argumentos de invocaciónid #..................... Identidad del procesopwd #............. Directorio actual de trabajoenv #..................... Variables de entornocat #...... Información en la entrada estandard#.......................................... FIN
Ejemplo: test.cgi
© Francisco Rosales <[email protected]>
Diseño de Servicios Web Common Gateway Interface
9
Para que funcione como CGI El servidor Web distingue un CGI de
cualquier otro fichero convencional: Por su ubicación:
Debe residir en /cgi-bin del sistema(o de la cuenta del usuario)
Por su extensión: El nombre del fichero debe tener extensión
.cgi Por sus permisos:
Lectura y ejecución para todo el mundo
© Francisco Rosales <[email protected]>
Diseño de Servicios Web Common Gateway Interface
10
¿Cómo invocar un CGI? I Directamente desde el Navegador
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
11
¿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
12
¿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 CGIrecibirá los parámetros
<FORM ACTION="/cgi-bin/test.cgi" METHOD="GET" >
© Francisco Rosales <[email protected]>
Diseño de Servicios Web Common Gateway Interface
13
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
Al CGI le llegan como variables de entorno PATH_INFO
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
© Francisco Rosales <[email protected]>
Diseño de Servicios Web Common Gateway Interface
14
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
15
Método de invocación I Todo formulario HTML debe indicar:
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 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
16
Método de invocación II REQUEST_METHOD
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
Llegarán por la entrada estándar La variable CONTENT_LENGTH indicará el
número de bytes de información
© Francisco Rosales <[email protected]>
Diseño de Servicios Web Common Gateway Interface
17
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
18
Identificación del cliente REMOTE_ADDR
Dirección IP del cliente que invocó al CGI REMOTE_HOST
Dirección completa del cliente que invocó al CGI REMOTE_IDENT
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
© Francisco Rosales <[email protected]>
Diseño de Servicios Web Common Gateway Interface
19
Identificación del servidor SERVER_NAME
Nombre del servidor como se indicó en el URL
SERVER_PORT 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
20
Sobre la conexión I GATEWAY_INTERFACE
Versión del protocolo CGI implementado
DOCUMENT_ROOT Directorio raíz del servicio Web
HTTP_HOST Nombre del servidor
© Francisco Rosales <[email protected]>
Diseño de Servicios Web Common Gateway Interface
21
Sobre la conexión II HTTP_REFERER
URL de la página desde la que se accedió al CGI HTTP_USER_AGENT
Identificación del navegador usado por el cliente HTTP_COOKIE
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
22
Parámetros de entrada I PATH_INFO
Camino extra expresado en el URL del CGI PATH_TRANSLATED
Es la concatenación de DOCUMENT_ROOT y PATH_INFO
REQUEST_METHOD 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
23
Parámetros de entrada II 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 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
24
¿Qué puede devolver? Todo CGI deberá emitir por la
salida estándar su resultado Un documento MIME completo O la localización del documento
resultante
© Francisco Rosales <[email protected]>
Diseño de Servicios Web Common Gateway Interface
25
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
26
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á
URL remoto: el cliente ha de seguirlo
Location: http://www.w3.org/pub/WWW/
Location: /pub/WWW/
© Francisco Rosales <[email protected]>
Diseño de Servicios Web Common Gateway Interface
27
CGI con salida NPH Non Process Header
Exige el prefijo nph- El 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 bienContent-Type: .......
© Francisco Rosales <[email protected]>
Diseño de Servicios Web Common Gateway Interface
28
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 referenciashttp://dir.yahoo.com/Computers_and_Internet/Internet/World_Wide_Web/CGI___Common_Gateway_Interface/
Lista de enlaces relativos a CGIshttp://users.erols.com/foxdm/cgi.htm
CGI Programming 101http://www.cgi101.com/class/