Common Gateway Interface

Anuncio
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
Descargar