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