Prefacio
Las aplicaciones web (
web-based application )
browser ) que
hace el papel de cliente; por otro lado, se tiene el servidor web que representa la parte servidor. Para crear cada una de las partes, cliente y servidor, se emplean distintas tecnologas. As, por ejemplo, para programar un cliente web se suele utilizar HTML, JavaScript o
applets
servidor web se emplea CGI, SSI, ASP o JSP. En este libro se repasan las tecnologas que fueron esenciales en la programacin de los servidores web durante los primeros aos de la web. Las tres tecnologas que se presentan en este libro, CGI, SSI e IDC, permiten crear pginas web dinmicas. Mientras que CGI y SSI an se emplean muy a menudo, IDC ha sido superado por tecnologas que han aparecido posteriormente. Sin embargo, debido a la sencillez de IDC, he considerado que es un punto de inicio muy adecuado para afrontar el estudio de tecnologas ms avanzadas pero a su vez ms complicadas. Para afrontar correctamente el estudio de los temas tratados en este libro, hace falta poseer unos mnimos conocimientos sobre HTML. Existen multitud de libros sobre HTML, pero recomiendo la consulta del libro
Programacin en
l, se trata la programacin de la parte cliente de las aplicaciones web y en particular se estudian HTML y JavaScript. El contenido de este libro se ha dividido en tres captulos y un apndice. Los tres captulos son independientes, por lo que se pueden leer en cualquier orden. El libro adems posee una serie de ndices que permiten su empleo como obra de referencia. El captulo primero trata sobre CGI: presenta el estndar CGI, describe
iii
iv
Prefacio
las distintas formas que existen de enviar informacin a un programa CGI, explica cmo emplear las variables de entorno y comenta algunos consejos que pueden ayudar a lograr programas CGI ms seguros. El lenguaje empleado para programar los CGI de ejemplo que contiene este captulo es necesario poseer unos conocimientos mnimos de
El segundo captulo est dedicado a SSI. Se explica su uso, los comandos ms comunes (no todos los servidores web aceptan los mismos comandos) y se incluyen varios ejemplos. El tercer captulo explica la tecnologa IDC de Microsoft y cmo generar pginas web dinmicas a partir de la informacin almacenada en una base de datos. Por ltimo, el nico apndice del libro complementa el captulo tres, ya que explica como crear un DSN para acceder a una base de datos mediante ODBC. Para nalizar, quisiera mandar un abrazo a mi familia y a Marisa, la gente que quiero; un saludo a los amigos y compaeros del Laboratorio Multimedia (mmlab), con los que trabaj y disfrut de buenos momentos, y otro saludo a los amigos y compaeros del Departamento de Lenguajes y Sistemas Informticos de la Universidad de Alicante, con los que trabajo (y espero seguir trabajando).
ndice general
Prefacio ndice general ndice de cuadros ndice de guras ndice de acrnimos 1. CGI
1.1. 1.2. 1.3. 1.4. 1.5. Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Un ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Aplicaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Qu necesito para programar un CGI . . . . . . . . . . . . . . . Lenguaje de programacin . . . . . . . . . . . . . . . . . . . . . 1.5.1. 1.5.2. 1.6. 1.7. 1.8. 1.9. Independencia de plataforma . . . . . . . . . . . . . . .
iii v ix xi xiii
1
2 5 5 6 7 8 8 9 10 11 17 17 18 22 24 25
Independencia de servidor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.10.1. A travs de la lnea de comandos . . . . . . . . . . . . . 1.10.2. Cmo tratar los formularios . . . . . . . . . . . . . . . . 1.10.3. A travs de la URL . . . . . . . . . . . . . . . . . . . . . 1.10.4. A travs de la entrada estndar . . . . . . . . . . . . . .
vi
ndice general
26 26 26 27 28 29 31 36 36 39 39 39 40 40 42 42 42 43 43 43 43 44
1.11.4. Cmo acceder a las variables desde C . . . . . . . . . . . 1.12. Un ejemplo ms complejo 1.13. Seguridad . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
1.13.3. Versiones estables . . . . . . . . . . . . . . . . . . . . . . 1.13.4. Las presunciones son peligrosas . . . . . . . . . . . . . . 1.13.5. Programa defensivamente . . . . . . . . . . . . . . . . .
1.13.6. Limpia los datos antes de usarlos . . . . . . . . . . . . . 1.13.7. Limpia los datos antes de pasarlos a otro programa . . . 1.13.8. Cuidado con HTML 1.13.9. Nivel de privilegio 1.13.10. Nivel de prioridad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.13.12. Consulta listas de correo y grupos de noticias . . . . . . 1.13.13. Nunca olvides el cdigo fuente . . . . . . . . . . . . . .
1.14. WinCGI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2. SSI
2.1. 2.2. 2.3. 2.4. 2.5. Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Qu necesito para programar mediante SSI . . . . . . . . . . . . Procesamiento de los archivos . . . . . . . . . . . . . . . . . . . Comentarios HTML y comandos SSI . . . . . . . . . . . . . . . Comandos SSI ms comunes . . . . . . . . . . . . . . . . . . . . 2.5.1. 2.5.2. 2.5.3. 2.5.4. 2.5.5. 2.5.6. 2.6. cong echo exec . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
47
48 48 49 50 51 51 54 58 59 61 61 62
astmod . . . . . . . . . . . . . . . . . . . . . . . . . . . fsize . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
include . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ndice general
vii
3. IDC
3.1. 3.2. 3.3. 3.4. 3.5. Introduccin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cmo funciona . . . . . . . . . . . . . . . . . . . . . . . . . . . Qu necesito para programar mediante IDC . . . . . . . . . . . Un IDC sencillo . . . . . . . . . . . . . . . . . . . . . . . . . . . El archivo .idc . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.5.1. 3.5.2. 3.5.3. 3.6. 3.6.1. 3.6.2. 3.7. 3.8. Campos obligatorios . . . . . . . . . . . . . . . . . . . . Campos opcionales . . . . . . . . . . . . . . . . . . . . . Campos opcionales avanzados de ODBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Valor de un campo en un formulario Variables integradas
67
68 68 69 72 74 74 75 77 77 78 79 79 80 80 81 84
El archivo .htx
Cmo procesar los campos de un formulario . . . . . . . . . . . Un IDC ms complejo 3.8.1. 3.8.2. 3.8.3. . . . . . . . . . . . . . . . . . . . . . . . Ejemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . Ejemplo 2 . . . . . . . . . . . . . . . . . . . . . . . . . . Ejemplo 3 . . . . . . . . . . . . . . . . . . . . . . . . . .
87
87 91
99 101
ndice de cuadros
1.1. 1.2. 1.3. 1.4. 1.5. 2.1. 2.2. 2.3. 2.4. 3.1. Diferencias entre una pgina HTML normal y una pgina generada a partir de un CGI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 8 12 16 24 55 56 56 60 78 Lenguajes de programacin ms comunes Cdigos de estado HTTP ms usuales
Modicadores de sizefmt . . . . . . . . . . . . . . . . . . . . . . Parmetros del comando astmod, fsize e include . . . . . . . . Operadores de las expresiones lgicas . . . . . . . . . . . . . . .
ix
ndice de guras
1.1. 1.2. 1.3. 1.4. 1.5. 1.6. 1.7. 1.8. 1.9. 2.1. 2.2. 2.3. 2.4. 2.5. 2.6. 3.1. 3.2. 3.3. 3.4. 3.5. 3.6. 3.7. Esquema bsico de una aplicacin web basada en CGI Ejecucin desde una ventana de MS-DOS . . . . . 4 15 19 22 30 37 38 38 50 53 53 57 60 65 70 71 72 73 74 83 85 89 90 92 Mensaje de error porque el encabezado no es correcto . . . . . . . . . . . . . . . . . . . . . . . . . . .
Pgina con cuadro de texto ISINDEX para realizar una bsqueda 21 Pgina de respuesta a una bsqueda ISINDEX Ejemplo de variables de entorno . . . . . . . . . . . . . . . . . . cgi-select: pgina 1 . . . . . . . . . . . . . . . . . . . . . . . . . cgi-select: pgina 2 . . . . . . . . . . . . . . . . . . . . . . . . . Permisos de ejecucin en Microsoft Personal Web Server . . . . Permisos de ejecucin en Microsoft Personal Web Server . . . . Mensaje de error por defecto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mensaje de error personalizado Ejemplo de comando exec
Ejemplo de comando echo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ejemplo de programa ejecutado mediante exec . . . . . . . . . . Esquema bsico de una aplicacin web basada en IDC Mensaje de error porque no hay permisos de ejecucin Ejemplo de un IDC sencillo . . . . . . . . . .
Permisos de ejecucin en Microsoft Personal Web Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Mensaje de error porque no existe DNS Formulario de acceso a la parte privada
A.1. Mecanismos de acceso a bases de datos . . . . . . . . . . . . . . A.2. Arquitectura de ODBC . . . . . . . . . . . . . . . . . . . . . . . A.3. Fuentes de datos ODBC . . . . . . . . . . . . . . . . . . . . . .
xi
xii
ndice de guras
A.4. Pantalla principal de Fuentes de datos ODBC . . . . . . . . . . A.5. Seleccin del controlador . . . . . . . . . . . . . . . . . . . . . . A.6. Creacin de un DSN para Microsoft Access . . . . . . . . . . . A.7. Seleccionar una base de datos . . . . . . . . . . . . . . . . . . . A.8. Crear una base de datos . . . . . . . . . . . . . . . . . . . . . .
93 94 95 96 97
ndice de acrnimos
API Application Program Interface
Interfaz de programacin de aplicaciones. Conjunto de constantes, funciones y protocolos que permiten programar aplicaciones. Una buena API facilita la tarea de desarrollar aplicaciones, ya que facilita todas las piezas y el programador slo tiene que unirlas para lograr el n que desea.
ASP son similares a los programas CGI. Las pginas ASP suelen estar
ASCII
ASCII
extendidos de 256 caracteres (8 bits), que permiten representar caracteres no ingleses como las vocales acentuadas o la ee. Los caracteres de la parte superior (128 a 255) de estos cdigos (ocialmente ISO-8859-1).
ASCII
extendidos varan
ISO
Latin-1
xiv
ndice de acrnimos
en
o en
general.
Microsoft Windows.
DNS Domain Name System IP. Cada vez que se emplea un nombre de dominio, un servidor de DNS tiene que traducir el nombre de dominio en su correspondiente direccin IP. Por ejemplo, el nombre de dominio www.ua.es se corresponde con la direccin IP 193.145.233.99.
nombres de dominio en direcciones Sistema de nombres de dominio. Servicio de Internet que traduce los
DSN
necesaria para conectar una aplicacin con una base de datos mediante
ODBC.
W3C se encarga de su estandarizacin. El futuro sustituto de HTML es XHTML. HTTP HyperText Transfer Protocol
Protocolo de transferencia de hipertexto. Es el protocolo que se emplea en
WWW. Dene como se tienen que crear y enviar los mensajes y que
stateless
acciones debe tomar el servidor y el navegador en respuesta a un comando. Es un protocolo (sin estado), porque cada comando se ejecuta independientemente de los anteriores o de los posteriores. Actualmente, la mayora de los servidores soportan
cipales ventajas de esta versin es que soporta conexiones persistentes: una vez que el navegador se conecta al servidor, puede recibir mltiples cheros a travs de la misma conexin, lo que aumenta el rendimiento de
ndice de acrnimos
xv
RFC
ASP.
IP Internet Protocol
Protocolo de Internet. Protocolo bsico de Internet perteneciente a la familia
el esquema de direccionamiento.
Permite
Java.
ASP de Microsoft. Se
RFC 1522.
ODBC, se puede cambiar la parte servidor (la base de datos) sin tener
que cambiar el cliente.
xvi
ndice de acrnimos
RFC recibe un n-
URL Universal Resource Locator Tambin conocido como Uniform Resource Locator. Sistema de direccionamiento de mquinas y recursos en Internet. Es decir, se trata de una direccin que permite localizar cualquier mquina o documento que se encuentre accesible a travs de Internet.
ndice de acrnimos
xvii
WWW World Wide Web WWW). Su protocolo de comunicacin es HTTP, su lenguaje de creacin de documentos HTML y su sistema de direccionamiento de los recursos URL. Los navegadores web (browsers ) permiten navegar por la web.
res conectados a Internet forman parte de la Sistema de servidores web conectados a Internet (no todos los ordenado-
XHTML Extensible HyperText Markup Language HTML escrito segn las normas que marca XML. Por tanto, se trata de una aplicacin concreta de XML y no tienen que confundirse entre
s.
SGML. Diseado especcamenWWW por W3C. Permite que un usuario disee sus propias
Captulo 1
CGI
El interfaz CGI permite que un cliente web (un navegador) ejecute un programa en el servidor web. Por medio de CGI se pueden crear pginas web dinmicas. El programa CGI y el servidor web se comunican a travs de la salida y entrada estndar. Los programas CGI pueden ser escritos mediante diferentes lenguajes de programacin.
ndice General
1.1. 1.2. 1.3. 1.4. 1.5. Introduccin Un ejemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 5 5 6 7
Lengua je de programacin . . . . . . . . . . . . . . .
8 8
9 10 11 17 17
Captulo 1.
CGI
1.10.3. A travs de la URL . . . . . . . . . . . . . . . . . . 24 1.10.4. A travs de la entrada estndar . . . . . . . . . . . . 25 1.10.5. A travs de informacin de ruta . . . . . . . . . . . . 26
1.11. Variables de entorno CGI . . . . . . . . . . . . . . . 26
Especcas del servidor . . . . . . . . Especcas del cliente . . . . . . . . . Especcas de la peticin . . . . . . . Cmo acceder a las variables desde C
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
26 27 28 29
31 36
. . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
1.13.1. Permisos de ejecucin . . . . . . . . . . . . . . . . 1.13.2. Examina el cdigo . . . . . . . . . . . . . . . . . . 1.13.3. Versiones estables . . . . . . . . . . . . . . . . . . 1.13.4. Las presunciones son peligrosas . . . . . . . . . . . 1.13.5. Programa defensivamente . . . . . . . . . . . . . . 1.13.6. Limpia los datos antes de usarlos . . . . . . . . . . 1.13.7. Limpia los datos antes de pasarlos a otro programa 1.13.8. Cuidado con HTML . . . . . . . . . . . . . . . . . 1.13.9. Nivel de privilegio . . . . . . . . . . . . . . . . . . 1.13.10.Nivel de prioridad . . . . . . . . . . . . . . . . . . 1.13.11.Usa un ordenador para los CGIs . . . . . . . . . . 1.13.12.Consulta listas de correo y grupos de noticias . . . 1.13.13.Nunca olvides el cdigo fuente . . . . . . . . . . .
. . . . . . . . . . . . .
36 39 39 39 40 40 42 42 42 43 43 43 43
44
1.14. WinCGI . . . . . . . . . . . . . . . . . . . . . . . . . .
1.1.
Introduccin
es un interfaz que permite transferir
aplicacin externa, una primera solucin puede ser incluir en el servidor web un interfaz para cada una de las aplicaciones externas que se quiera ejecutar. Pero est solucin es claramente inviable: es difcil y laborioso programar un
1.1. Introduccin
servidor web para que pueda acceder a todas las posibles aplicaciones existentes y, adems, mantenerlo al da segn surjan nuevas aplicaciones. En vez de ello, mediante seguir los servidores web y las aplicaciones para poder interactuar entre s. En la Figura 1.1 est representado el funcionamiento bsico de una aplicacin web basada en
1.
Hyper-
2.
Universal Resource Locator URL) y detecta que se trata de un programa CGI. Ejecuta el CGI y
3.
CGI recibe los datos codicados, los descodica y realiza su funcin CGI no necesite recibir datos para cumplir su misin). La funcin que realiza el programa CGI se puede clasicar en procesamiento directo (el programa CGI realiza por
El (en algunos casos, es posible que un programa s mismo todo el procesamiento de los datos recibidos) y procesamiento indirecto (el programa
CGI
CGI genera su resultado: una pgina HyperText Markup Language (HTML), una imagen, un archivo de sonido, etc. y lo enva al
servidor web. El servidor web procesa la informacin recibida del programa aade el cdigo necesario para formar un encabezado
5.
HTTP correcto1 .
CGI:
le
6. 7.
El servidor web reenva el resultado del programa El cliente web muestra la salida del programa
CGI.
al cliente.
Captulo 1.
CGI
El uso de
CGI
ya que se requieren conocimientos de programacin y de administracin de permisos de los sistemas operativos empleados en los servidores web. La versin actual de este estndar es entre una pgina grama
HTML normal y una pgina generada a partir de un proCGI aparecen resumidas en el Cuadro 1.1. recupera CGI
la El servidor web grama
CGI/1.1.
Pgina HTML
El servidor web pgina El contenido es
esttico
CGI
ejecuta el prodin-
mico
Cuadro 1.1: Diferencias entre una pgina HTML normal y una pgina generada a partir de un CGI
CGI? En principio, no hay limitaciones. Pero cualquier cosa que haga un CGI, lo tiene que hacer rpidamente y empleando la menor cantidad posible de recursos. Si no, el usuario se desesperar, se conectar a otra pgina y
Qu se puede hacer con un siempre hay que tener en cuenta la siguiente recomendacin: se prometer a s mismo no volver a visitar esa web donde las pginas tardaban una eternidad.
1.2. Un ejemplo
1.2.
Un ejemplo
Cuando se introduce en el formulario de un buscador (por ejemplo, Google, Altavista o Yahoo!) un termino a buscar, el navegador (
Microsoft Internet Explorer o Netscape Communicator) enva una peticin al servidor web 2 (Apache o Microsoft Internet Information Server ) en la que se solicita una pgina
nueva y que se acompaa del trmino a buscar. El servidor web recibe la solicitud, comprueba que la pgina que se solicita es un programa
trmino a buscar, le pasa informacin auxiliar en forma de variables de entorno, como por ejemplo la direccin El programa ha empleado para enviar el trmino a buscar, etc.
CGI
chero plano) y localiza la informacin solicitada. El programa de forma dinmica y en tiempo real una pgina informacin encontrada y enva el resultado al servidor web. El servidor web reenva la pgina generada por el programa gador.
1.3.
Aplicaciones
El uso de programas
vez de un sitio web esttico se puede tener un sitio interactivo que se adapte a las necesidades de los distintos usuarios (pginas web dinmicas segn el perl de cada usuario). Las aplicaciones de los programas Gestin de un libro de visitas o rmas (
puede recuperar la informacin introducida en un formulario de un libro de visitas, almacenarla en un chero y mostrar en una pgina web todas las visitas recibidas. Gestin de anuncios ( o segn la direccin (
forma aleatoria o de forma prejada (por ejemplo, segn la hora del da ciones de enlace. Adems, se puede controlar el nmero de pulsaciones
Captulo 1.
CGI
hit counters ). Ya sea contadores en modo texto o modo grco (el programa CGI devuelve una imagen que contiene el
Gestin de contadores ( valor del contador). Imgenes sensibles procesadas en el servidor web . Las imgenes sensibles o mapas de imgenes son imgenes que contienen zonas activas que actan como enlaces: en funcin de la zona de la imagen en la que pulse el usuario, se activa un enlace hacia un documento u otro. Tambin se puede hacer zoom en una imagen mediante esta tcnica. Acceso a bases de datos. Se puede emplear un programa pasarela (de ah el nombre de electrnico, etc.
1.4.
CGI
Linux para crear las pginas HTML que conectan con el programa CGI
y para crear el propio cdigo del programa Si se va a programar el
Bloc de notas
de
Microsoft Windows
joe
de
CGI.
Pascal, etc.), hace falta el correspondiente compilador. Si se va a programar mediante un lenguaje interpretado (Perl , shell de Unix, etc.), hace
falta el correspondiente intrprete.
Un servidor web (ya sea local o remoto) en el que se puedan ejecutar programas
CGI.
Por ejemplo, o
Microsoft Personal Web Server, Microsoft Apache. Netscape Communicator o Microsoft Inter-
CGI.
3
No es necesario disponer de una conexin a Internet, ya que se puede comprobar localmente el cdigo creado. Lo que s que es recomendable es utilizar un buen editor de textos, que sea cmodo, congurable, soporte macros, etc. y que sea ltima caracterstica signica que el editor es capaz de comprender el lenguaje en el que se programa, y colorea las palabras diferencindolas segn sean variables, palabras reservadas, comentarios, etc.
1.5.
Lenguaje de programacin
Como un
CGI
programar en cualquier lenguaje que permita crear ejecutables para el sistema operativo del servidor. Lo nico que se le exige al lenguaje de programacin es que sea capaz de: Leer datos de la entrada estndar. Acceder a las variables de entorno. Escribir en la salida estndar. Por tanto, la eleccin de un lenguaje se basa principalmente en qu lenguajes se conocen y qu lenguajes estn disponibles en el sistema. Probablemente,
CGI
CGI
con lenguajes de
lenguajes compilados, porque son ms fciles de depurar, modicar y mantener que un programa compilado. Sin embargo, los programas compilados son ms rpidos a la hora de ejecutarse, ya que los
scripts
son interpretados.
Por tanto, la lista de lenguajes de programacin que se pueden emplear no tiene lmite; en el Cuadro 1.2 se muestran los ms empleados en la programacin de en
CGI (la lista no es excluyente: nada nos impide programar un CGI CGI se encuentra muy extendida en el mundo Internet,
Captulo 1.
CGI
Lenguaje
Cualquier shell de Unix Perl C, C++ Visual Basic AppleScript REXX
Sistema
Unix Unix, Windows, MacOS Unix, Windows, MacOS Windows MacOS OS2
Tipo
Interpretado Interpretado Compilado Compilado Interpretado Interpretado
C++), etc.
modicarlo. La mejor forma de lograrlo es por medio de un lenguaje universal y no empleando cdigo especco del sistema (llamadas al sistema operativo, por ejemplo). Esto se traduce en el uso de lenguajes como
prcticamente en cualquier plataforma. Si se tienen que emplear llamadas al sistema operativo, es conveniente aislar el cdigo que las realiza en mdulos independientes, de forma que al trasladar el cdigo de una plataforma a otra se minimizan y facilitan los cambios necesarios.
C:\TEMP WWWROOT
C:\INETPUB\-
No asumir que el programa se va a ejecutar con unos permisos (privilegios) concretos. No asumir la existencia de conguraciones de red concretas: direcciones
No asumir la presencia de programas externos, como por ejemplo, suponer que est disponible en cualquier instalacin el programa
Unix.
Si deseamos distribuir un programa
sendmail
de
CGI
evitar todos estos problemas, la mejor solucin es proporcionar al usuario la posibilidad de congurar los valores dependientes del servidor mediante un chero de conguracin.
1.6.
CGI
bilidad que se tena de aadir interactividad y dinamismo a los sitios web. Pero desde entonces han surgido distintas soluciones que sustituyen completamente este estndar. Entonces, por qu seguir usando razones:
1.
CGI es el mtodo ms rpido cuando se ejecuta mucho cdigo. Sin embargo, cuando el cdigo que se tiene que ejecutar es pequeo y poco complejo, las pginas activas como
Pages (JSP)
2.
PHP
CGI es un estndar, compatible con la mayora (por no decir la totalidad) de los servidores web. Podemos crear un programa CGI que se ejecute
en distintos servidores web en distintas plataformas.
3.
10
Captulo 1. CGI
4.
Un programa un
5.
Cmo es una tecnologa establecida y probada (es decir, antigua), existen multitud de recursos, tales como tutoriales, programas
CGI gratui-
tos, libreras, etc. La mayora de los problemas que nos pueden surgir ya han sido resuelto y slo hay que buscar qu soluciones se han planteado y cul es la mejor.
1.7.
Como se ha comentado en el apartado anterior, existen una serie de ventajas a la hora de emplear inconvenientes: 1.
CGI es una tecnologa obsoleta. Desde su nacimiento, han surgido otras posibilidades: applets , servlets , ASP, ColdFusion, JSP, PHP, etc. CGI no mantiene el estado automticamente5 . Otras tecnologas (ASP,
por ejemplo) mantienen el estado, lo que facilita la programacin de aplicaciones web como carritos de la compra ( correo a travs de la web (
2.
emplear los campos ocultos de los formularios : en ellos se almacenan las selecciones del usuario o un identicar nico ( actividad de una pgina a otra. 3. La integracin entre un programa
La nica comunicacin que se establece entre ambos es para transmitir los datos de entrada y la salida producida por el programa .
protocolo
HTTP
HTTP
y no a
CGI
. El
que lo hace. Entre las distintas peticiones no se almacena ningn tipo de informacin sobre el cliente en el servidor.
HTML
6 7
<INPUT TYPE="HIDDEN">.
Esto es una desventaja y a la vez una ventaja: gracias a que la integracin es tan dbil, un
programa
CGI
11
4.
Cada vez que se tiene que ejecutar un programa tancia nueva del programa en memoria.
1.8.
El primer CGI
CGI se tiene que dirigir a CGI puede devolver cualquier tipo de documento. Cada documento que un CGI enva a un servidor web debe contener una cabecera (tambin llamado encabezado HTTP) al principio del
La salida o resultado que produce un programa mismo que indica el tipo de documento que es y as tanto el servidor como el cliente web presa mediante los tipo
tre s por saltos de lnea. Muy importante: al nal de la cabecera se tiene que dejar una lnea en blanco , que indica donde termina la cabecera y empieza el
1 2 3 4 5
Los navegadores web usan los tipos Multipurpose Internet Mail Extensions (
para saber con que programa tienen que mostrar un documento que no pueden tratar directamente (por ejemplo, un documento de Microsoft Word). Estos programas pueden ser externos al navegador o estar incluidos en l en forma de plug-ins .
MIME
La lnea en blanco se puede indicar con un salto de lnea (LF) o con un retorno de carro
+ LF).
12
Captulo 1. CGI
application/msword application/octet-stream application/pdf application/x-shockwave-flash audio/midi audio/x-midi image/gif image/jpeg text/html text/plain text/richtext text/vnd.wap.wml text/xml video/mpeg video/quicktime video/msvideo video/x-msvideo
Tipo
Extensin
doc bin exe pdf swf midi mid
gif jpeg jpe jpg html htm txt rtx wml xml xsl mpeg mpg mpe qt mov avi
13
6 7
</BODY> </HTML>
En la primera lnea se indica el tipo El formato que se emplea es se trata de una pgina
la cabecera de la respuesta ha terminado, se tiene que dejar una lnea en blanco. Por ltimo, se incluye el contenido de la respuesta. El siguiente programado en instruccin
CGI
printf("\n");
1 2 3 4 5 6 7 8 9 10 11
#include <stdio.h>
Ejemplo 1.2
int main(int argc, char *argv[]) { printf("Content-type: text/html\n"); printf("\n"); printf("<HTML>\n<BODY>\n"); printf("Hola mundo!\n"); printf("</BODY>\n</HTML>\n"); return 0; }
<BR>
del cdigo
\n
printf("<HTML><BODY>Hola mundo!</BODY></HTML>");
10
...).
printf(...) o fprintf(stdout,
14
Captulo 1. CGI
Los saltos de lnea los incluimos para facilitar la lectura del cdigo
HTML
redirect )
la respuesta a otra
Location: URL, donde URL puede ser una direccin de cualquier tipo (absoluta,
relativa, a otro servidor, etc.). Por ejemplo, el siguiente programa redirige la respuesta a la direccin
http://www.ua.es.
CGI en C
1 2 3 4 5 6 7 8 9 10 11 12 13
#include <stdio.h>
Ejemplo 1.4
int main(int argc, char *argv[]) { printf("Content-type: text/html\n"); printf("Location: http://www.ua.es\n"); printf("\n"); printf("<HTML>\n<BODY>\n"); printf("Nueva direccin: "); printf("<A HREF=\"http://www.ua.es\">http://www.ua.es</A>\n"); printf("</BODY>\n</HTML>\n"); return 0; }
Algunos navegadores antiguos no aceptan la redireccin (no reconocen la
instruccin
Location).
cdigo anterior, incluir la posibilidad de que los navegadores antiguos tambin puedan acceder a la informacin (aunque de forma manual a travs de un enlace!). Si no se quiere dar soporte a los navegadores antiguos, el cdigo anterior se puede reducir al siguiente:
1 2
#include <stdio.h>
11
Ejemplo 1.5
net Explorer: botn derecho del ratn y seleccionar acceder a travs de los mens.
; Microsoft Inter-
. Tambin se puede
12
Aunque parezca una posibilidad poco til, se puede aprovechar esta posibilidad para
mantener un registro de los enlaces que selecciona un usuario. Tambin se puede emplear para redireccionar de forma aleatoria.
15
3 4 5 6 7 8
Aunque parezca repetitivo, hay que recordar siempre dejar una lnea en blanco al nal de la cabecera, incluso aunque no haya cuerpo. En la Figura 1.2 se muestra el mensaje de error que muestra el navegador
CGI
Microsoft In-
Status: nnn xxxxx, donde nnn es un cdigo de estado de tres dgitos y xxxxx es un mensaje
un cdigo y mensaje de error. Para ello, se emplea la instruccin de error. En el Cuadro 1.4 mostramos algunos de los cdigos ms usuales.
CGI
comunicar
16
Captulo 1. CGI
Cdigo Resultado
200 202 204 301 302 400 401 403 404 500 502 OK Accepted
Descripcin
Ningn problema La peticin se est procesando, pero ha sido aceptada
No Response Moved Found Bad Request Unauthorized Forbidden Not Found Server Error Service Overloaded
El servidor no desea enviar ninguna respuesta El documento se ha trasladado a un nuevo sitio El documento no est donde se esperaba, pero se ha encontrado en algn otro sitio en el servidor La sintaxis de la peticin HTTP no es correcta El documento requiere unos permisos que no posee el usuario El servidor deniega el acceso al documento El servidor no puede encontrar el documento El servidor ha generado un error El servidor est muy ocupado y no puede servir la peticin
17
1.9.
CGI enva su salida al servidor web, ste le aade las instrucciones necesarias para formar un mensaje HTTP correcto. En algunos
Cuando el programa casos, se puede querer evitar esta sobrecarga y hablar directamente con el cliente web. En este caso, el programa mensaje
HTTP correcto.
CGI
es el responsable de crear un
CGI
de otros,
CGI debe comenzar por nph-13 . Por ejemplo, las siguientes instrucciones representan un mensaje HTTP correcto:
1 2 3 4 5 6 7
Ejemplo 1.6
1.10.
Un programa
CGI
command line ).
URL (QUERY_STRING).
CGI
que en cada caso tiene que actuar de distinta forma. Los dos mtodos ms populares son a travs de la de la entrada estndar (mtodo
13
18
Captulo 1. CGI
ISINDEX.
CGI
separados por espacios en blanco. Esta lista se recibe de dos formas: Por la lnea de comandos: cada trmino es un argumento de la lnea de comandos. Adems, los trminos se encuentran descodicados.
QUERY_STRING: el servidor crea una variable de entorno14 llamada QUERY_STRING y le asigna una cadena que contiene los trminos de la
Por la bsqueda. La cadena no se encuentra descodicada. Desde el cliente web, se puede enviar una peticin de consulta servidor web de dos formas: mediante el uso de la etiqueta mente en la
URL.
La sintaxis de la etiqueta
ISINDEX
es:
<ISINDEX PROMPT="texto">
donde
Ejemplo 1.7
texto
puede emplear para introducir trminos de bsqueda. Esta etiqueta tiene que emplearse en la cabecera del documento etiqueta se muestra en un navegador: la Figura 1.4 podemos ver como el siguiente cdigo
1 2 3 4 5 6 7 8 9 10 11
<HTML> <HEAD> <ISINDEX PROMPT="Ciudad de residencia "> </HEAD> <BODY> Introduzca el nombre de la ciudad donde reside. El sistema le informar sobre el estado del tiempo.<BR> Posibles ciudades: Alicante, Valencia, Castelln </BODY> </HTML>
14
Ms adelante se explican las variables de entorno CGI.
Ejemplo 1.8
19
Como se puede observar, en ninguna parte se indica el programa cuando el usuario pulse la tecla
CGI que
se tiene que ejecutar cuando el cliente realice una consulta (que se realizar
Enter ( ) y el foco est situado en el cuadro de texto que representa la etiqueta ISINDEX). La pgina HTML se va a llamar
El siguiente cdigo en
as misma, as que para que haya procesamiento de algn modo, el cdigo anterior lo tiene que haber generado previamente un programa que se ejecuta el documento una ventana de
CGI.
ver la salida que produce este programa cuando se ejecuta directamente desde
MS-DOS.
Figura 1.3: Ejecucin desde una ventana de MS-DOS Cuando se realiza una consulta, se vuelve a ejecutar el programa
CGI
ste detecta que se le pasa alguna informacin a travs de la lnea de comandos: en el cdigo del programa se puede observar como se consulta la variable
argc
en la lnea 9 para saber si se han recibido parmetros a travs de la lnea de comandos. Por ejemplo, en la Figura 1.5 podemos ver la pgina que se genera cuando se introduce en el campo de entrada la cadena
Alicante.
20
Captulo 1. CGI
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
Ejemplo 1.9
int main(int argc, char *argv[]) { int i; if(argc == 1) { printf("Content-type: text/html\n\n"); printf("<HTML>\n"); printf("<HEAD>\n"); printf("<ISINDEX PROMPT=\"Ciudad de residencia \">\n"); printf("</HEAD>\n"); printf("<BODY>\n"); printf("Introduzca el nombre de la ciudad donde reside. "); printf("El sistema le informar sobre el estado del tiempo."); printf("<BR>\n"); printf("Posibles ciudades: Alicante, Valencia, Castelln\n"); printf("</BODY>\n</HTML>"); } else { printf("Content-type: text/html\n\n"); printf("<HTML>\n<BODY>\n"); if(!strcmp(argv[1], "Alicante")) { printf("<CENTER><IMG SRC=\"nubes.gif\"></CENTER>\n"); printf("Cielo nublado. "); printf("Posibilidad de precipitacin al anochecer."); } else if(!strcmp(argv[1], "Valencia")) { printf("<CENTER><IMG SRC=\"sol.gif\"></CENTER>\n"); printf("Cielo despejado. "); printf("Vientos de aire caliente procedentes de levante."); } else if(!strcmp(argv[1], "Castelln")) { printf("<CENTER><IMG SRC=\"lluvias.gif\"></CENTER>\n");
21
42 43 44 45 46 47 48 49 50 51
} }
return 0;
Figura 1.4: Pgina con cuadro de texto ISINDEX para realizar una bsqueda
URL (de forma manual). Cuando se llama a un programa CGI (por ejemplo,
en un enlace) se pueden aadir trminos de bsqueda a continuacin del nombre del bsqueda. Si hay ms de uno, se tienen que separar por un signo ms (+)
ISINDEX
es directamente a travs de la
15
Ms adelante veremos que el signo ms se emplea para codicar los espacios en blanco
en la
URL
22
Captulo 1. CGI
Muy importante: si los trminos de bsqueda contienen un signo igual (=), entonces no se realizar una consulta cuadro de texto de una etiqueta codicarlo
ISINDEX
y la informacin no se pasar
16 .
ISINDEX,
CGI
el usuario en los controles de un formulario. Pero antes de estudiar esos dos mtodos, hay que saber que el navegador codica automticamente la entrada del usuario cuando la enva al servidor web. Los datos introducidos en un formulario se envan al programa
control1=valor1&control2=valor2&...&controln=valorn
16
El cdigo del signo igual es %3D.
Ejemplo 1.10
23
los
control1, control2, ..., controln son los distintos nombres de controles que forman el formulario y valor1, valor2, ..., valorn son
donde
los distintos valores que ha introducido o seleccionado el usuario y las distintas parejas
control=valor
se separan mediante
ampersand (&).
Por ejemplo, a
partir de un formulario con tres controles se puede obtener una entrada como la siguiente:
nombre=Jose&universidad=UA&carrera=Derecho
Si el usuario no ha especicado un determinado valor en algn control,
Ejemplo 1.11
control=,
sin ningn
Otro aspecto importante es que en los valores introducidos por el usuario, los espacios en blanco se sustituyen por el signo especiales, como por ejemplo &,
%
%, $
y si aparecen caracteres
Se emplea esta codicacin de los datos de entrada para evitar una interpretacin accidental de caracteres especiales por parte del sistema operativo, lo que podra originar un agujero de seguridad. Por tanto, el programa antes de poder hacer nada: 1. Tiene que separar las distintas parejas
que dividir los datos recibidos cada vez que se encuentre un un usuario introduce un 2.
ampersand
Una vez que se tienen las distintas parejas, se separan en nombre de control y valor de control usando para ello el signo igual (=). No hay peligro de confundirse con la entrada del usuario, ya que si un usuario introduce un signo igual, se enva codicado ( %3D).
17
que 127 (7F hexadecimal). El espacio en blanco podra codicarse como %20, pero como el espacio en blanco es tan comn, se ahorra espacio y es ms elegante emplear el signo ms (+).
ASCII
24
Captulo 1. CGI
3.
Los distintos valores se descodican. Se substituyen los signos ms por espacios en blanco y se buscan cadenas de la forma %##, donde
##
son
cdigos hexadecimales. No hay peligro de confundirse con la entrada del usuario, ya que si un usuario introduce un signo porcentaje, se enva codicado ( %25). En el Cuadro 1.5 se han resumido los caracteres especiales que se emplean en la codicacin
URL.
Nombre
Ampersand Equal Percent Plus
Carcter Propsito
& = % +
Separa pares del control
control=valor
Separa el nombre del control del valor Marca el inicio de un carcter codicado Substituye espacios en blanco
GET
o directamente a travs de la
QUERY_STRING.
URL.
18 con el mtodo de
El programa
CGI
recibe la
El navegador se encarga
de codicar la informacin que introduce el usuario en el formulario. Por tanto, si usamos el mtodo directo (directamente escrito en una codicar manualmente los datos. Cuando se usa este mtodo directamente a travs de la que se quieren enviar se aaden al nal de la del programa
CGI
URL,
subtotal,
cgi.exe
y se le
pondremos:
Ejemplo 1.12
METHOD,
se asume el mtodo
GET: si GET.
en un
25
HEAD,
similar al mtodo
GET,
POST.
El programa
CONTENT_LENGTH,
que
proporciona el nmero de bytes que se pueden leer. El servidor web tambin informa sobre el tipo de datos que va a recibir el programa variable de entorno un
CONTENT_TYPE. La codicacin estndar para los datos de formulario es application/x-www-form-urlencoded. Cuando se emplea este mtodo, la variable de entorno QUERY_STRING est
CGI mediante la
vaca, a no ser que despus del nombre del programa enva la entrada del usuario mediante a travs de la
URL:
POST,
1 2 3
Ejemplo 1.13
POST sobre el mtodo GET es que el primero QUERY_STRING, puede verse limitado por
no tiene ninguna limitacin sobre el nmero de bytes que se pueden enviar, mientras que el segundo, como los datos se envan en la se almacena en la variable de entorno el tamao mximo que pueda tener una Un programa o
URL y la informacin
POST
26
Captulo 1. CGI
CGI.
CGI desde el cliente URL, incluyendo informacin extra en la va de acceso al proCGI recibe la informacin extra en la variable de
PATH_INFO.
Esta forma de enviar informacin se emplea normalmente para transmitir la localizacin de cheros al programa usos. Por ejemplo, imaginemos que tenemos un pgina
HTML. Si queremos que procese el chero lista.txt que se encuentra CGI de esta forma:
en el directorio cheros que pertenece al directorio principal del sitio web, se tiene que realizar la llamada al programa
cgi-orden.exe/ficheros/lista.txt.
Ejemplo 1.14
1.11.
CGI. A continuacin
se muestran las variables ms importantes agrupadas en tres grupos: especcas del servidor, especcas del cliente y especcas de la peticin. Algunas variables puede ser que no estn disponibles en algunos servidores web. Por otro lado, adems de a todas estas variables de entorno especcas de etc. Cada programa
CGI,
tambin
PATH, TEMP,
valores. Se pueden ejecutar concurrentemente varios programas sin problemas, ya que cada uno recibir su propia copia de las variables de entorno.
27
GATEWAY_INTERFACE. SERVER_NAME.
(
CGI
utilizada por el servidor. El formato es CGI/versin. Ejemplo: El nombre del servidor, el alias
DNS)
o la direccin
IP
www.ua.es.
SERVER_PORT.
peticin
SERVER_PROTOCOL.
Ejemplo:
SERVER_SOFTWARE.
Ejemplo:
Microsoft-IIS/4.0.
CGI sobre
el cliente web (navegador). El servidor web obtiene la informacin a partir de las cabeceras que enva un cliente web en una peticin (por ello, todas las variables comienzan por recibe con cada peticin
HTTP, ya que el contenido de estas variables se HTTP20 ). No todos los clientes web proporcionan
HTTP_ACCEPT.
HTTP_ACCEPT_ENCODING.
19 20
gzip, deflate.
biado.
HTTP
HTTP
, el signo de subrayado
28
Captulo 1. CGI
es-ES,en,pdf. http://www.ua.es/-
HTTP_REFERER. index.html.
HTTP_USER_AGENT. Identica el software del cliente web. Ejemplo: para Netscape Communicator 4.7 se obtiene Mozilla/4.7 [en] (Win98; I) y para Microsoft Internet Explorer 5.5 la cadena Mozilla/4.0 (compatible; MSIE 5.5; Windows 98).
CGI
BASIC.
AUTH_USER.
CONTENT_LENGTH. Nmero de bytes enviados a la entrada estndar (stdin) de un programa CGI debido a una peticin POST. Esta variable est vaca cuando el mtodo empleado es GET. CONTENT_TYPE.
empleado es El tipo mediante el mtodo
GET.
POST.
Ejemplo:
application/x-www-form-urlencoded.
PATH_INFO.
Ejemplo:
da como parte de la
/myhome.
URL,
CGI pasa-
PATH_TRANSLATED. QUERY_STRING.
La versin traducida de
URL.
29
REMOTE_ADDR. La direccin IP del cliente web que hace la peticin. Ejemplo: 156.78.65.9. REMOTE_HOST.
El nombre de host del cliente que realiza la peticin. Si el
servidor no posee esta informacin, debe jar el valor de dejar esta variable en blanco.
REMOTE_ADDR
/scripts/cgivar.exe.
CGI en un servidor Microsoft Personal Web Server 4.0 ejecutndose en Microsoft Windows Explorer 5.5.
98 y cuando recibe una peticin de un cliente
Microsoft Internet
getenv()
es:
stdlib.h.
Ejemplo 1.15
Por ejemplo, el siguiente cdigo muestra el valor de las variables especcas del servidor mostradas en la Figura 1.6:
21
CGI
REQUEST_METHOD
30
Captulo 1. CGI
31
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
Ejemplo 1.16
int main(int argc, char *argv[]) { char *variable; fprintf(stdout, "Content-type: text/html\n\n"); fprintf(stdout, "<HTML>\n<BODY>\n"); /* SERVIDOR */ printf("<B>Especficas del servidor</B><BR>"); variable = getenv("GATEWAY_INTERFACE"); fprintf(stdout, "GATEWAY_INTERFACE: %s<BR>", variable); variable = getenv("SERVER_NAME"); fprintf(stdout, "SERVER_NAME: %s<BR>", variable); variable = getenv("SERVER_PORT"); fprintf(stdout, "SERVER_PORT: %s<BR>", variable); variable = getenv("SERVER_PROTOCOL"); fprintf(stdout, "SERVER_PROTOCOL: %s<BR>", variable); variable = getenv("SERVER_SOFTWARE"); fprintf(stdout, "SERVER_SOFTWARE: %s<BR>", variable); fprintf(stdout, "</BODY>\n</HTML>\n"); return 0;
1.12.
Un ejemplo ms complejo
que contiene la informacin que emplea el programa para construir la pgina. El programa genera dos pginas web. En la primera (Figura 1.7), se mues-
32
Captulo 1. CGI
tra una lista desplegable que contiene una serie de valores ledos del chero
cgi.data.
programa
la que se mostraba antes y otra cuyos valores dependen del valor elegido en la primera lista.
cgi-select.c
Este chero contiene el cdigo en
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
Ejemplo 1.17
/* Construye las opciones de la primera lista */ void optionsA(FILE *f) { char centinela = 1; char linea[100]; while(centinela) { /* Fin si se llega al final del fichero */ if(fgets(linea, 100, f) == NULL) centinela = 0; else { if(linea[0] == '*' && linea[strlen(linea) - 2] == '*') { /* Elimina el salto de linea */ linea[strlen(linea) - 1] = '\0'; printf("<OPTION VALUE=\"%s\">", linea); /* Elimina el ultimo asterisco */ linea[strlen(linea) - 1] = '\0'; /* +1: elimina el primer asterisco */ printf("%s</OPTION>\n", linea + 1); } } }
33
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
} /* Construye las opciones de la segunda lista */ void optionsB(FILE *f, char *s) { char centinela = 1; char linea[100]; while(centinela) { /* Fin si se llega al final del fichero */ if(fgets(linea, 100, f) == NULL) centinela = 0; else { if(!strncmp(s, linea, strlen(s))) { /* Lee todos los productos mientras que no se llegue al final del fichero a una linea con un salto de linea (fin de producto) */ while(centinela) { /* Fin si se llega al final del fichero */ if(fgets(linea, 100, f) == NULL) centinela = 0; else if(linea[0] == '\n') centinela = 0; else { /* Elimina el salto de linea */ linea[strlen(linea) - 1] = '\0'; printf("<OPTION>%s</OPTION>\n", linea); } } } } }
int main(void)
34
Captulo 1. CGI
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
char *var; char entrada[100]; int i, lon; FILE *f; f = fopen("cgi.data", "r"); if(f == NULL) { printf("Content-type: text/html\n\n"); printf("<HTML>\n"); printf("<HEAD>\n"); printf("<TITLE>CGI con listas desplegables - Error</TITLE>\n"); printf("</HEAD>\n"); printf("<BODY>\n"); printf("Error: no encuentro el fichero cgi.data\n"); printf("</BODY>\n</HTML>"); } return 0;
var = getenv("REQUEST_METHOD"); if(!strcmp(var, "GET")) { printf("Content-type: text/html\n\n"); printf("<HTML>\n"); printf("<HEAD>\n"); printf("<TITLE>CGI con listas desplegables - Pgina 1</TITLE>\n"); printf("</HEAD>\n"); printf("<BODY>\n"); /* El formulario llama al propio CGI */ var = getenv("SCRIPT_NAME"); printf("<FORM ACTION=\"%s\" METHOD=\"POST\">\n", var); printf("Seleccione sistema operativo:<BR>\n"); printf("<SELECT NAME=\"sistema\" ONCHANGE=\"submit();\">\n"); printf("<OPTION SELECTED></OPTION>\n"); optionsA(f); printf("</SELECT>\n"); printf("</FORM>\n"); printf("</BODY>\n</HTML>"); } else
35
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
/* Lee los datos recibidos por la entrada estndar */ var = getenv("CONTENT_LENGTH"); lon = atoi(var); for(i = 0; i < 100 & i < lon; i++) entrada[i] = fgetc(stdin); entrada[i] = '\0'; printf("Content-type: text/html\n\n"); printf("<HTML>\n"); printf("<HEAD>\n"); printf("<TITLE>CGI con listas desplegables - Pgina 2</TITLE>\n"); printf("</HEAD>\n"); printf("<BODY>\n"); /* El formulario llama al propio CGI */ var = getenv("SCRIPT_NAME"); printf("<FORM ACTION=\"%s\" METHOD=\"POST\">\n", var); printf("Seleccione sistema operativo:<BR>\n"); printf("<SELECT NAME=\"sistema\" ONCHANGE=\"submit();\">\n"); printf("<OPTION SELECTED></OPTION>\n"); optionsA(f); printf("</SELECT>\n"); printf("<BR><BR>\n"); /* +8: elimina sistema= */ printf("Seleccione producto para %s:<BR>\n", entrada + 8); printf("<SELECT>\n"); /* El puntero se posiciona en el principio del fichero */ fseek(f, 0, SEEK_SET); /* +8: elimina sistema= */ optionsB(f, entrada + 8); printf("</SELECT>\n"); printf("</FORM>\n"); printf("</BODY>\n</HTML>");
fclose(f); return 0;
36
Captulo 1. CGI
cgi.data
Este chero contiene la informacin que se quiere mostrar en las listas. Cada valor tiene que escribirse en una lnea independiente; los valores principales que se quieran mostrar en la primera lista tienen que aparecen encerrados entre asteriscos (*), a continuacin se escriben los valores (segunda lista) correspondientes al valor principal. Muy importante: los valores principales no pueden contener espacios en blanco ni caracteres especiales. A continuacin se muestra el chero empleado en la Figura 1.7 y 1.8.
1 2 3 4 5 6 7 8 9 10 11 12
*Windows95* Actualizacin USB Parche efecto 2000 *Windows98* Parche problemas de apagado Parche agujero de seguridad *Windows2000* Actualizacin Office 2000 Parche seguridad IIS Internet Explorer 6.0
Ejemplo 1.18
1.13.
Seguridad
El estndar como un
CGI no es inseguro por s mismo: simplemente dene un ines un programa ejecutable, al usarlo en nuestra web estamos
terfaz para que un servidor web se comunique con aplicaciones externas. Pero
CGI
permitiendo que extraos ejecuten un programa en nuestro servidor, lo cual no es lo ms seguro del mundo. Por tanto, existen una serie de precauciones que hay que tener en cuenta a la hora de programar un
CGI.
que residir en un directorio especial, de forma que el servidor web sepa que
1.13. Seguridad
37
CGI
en su directorio
particular sin que el administrador del sistema lo sepa y lo permita. Normalmente, en los servidores web que se ejecutan en sistemas directorio se llama
soft,
/cgi-bin o /cgibin. En los dos servidores web de MicroMicrosoft Personal Web Server y Microsoft Internet Information Server, el directorio suele llamarse /Scripts. En la Figura 1.9 podemos ver los permisos que posee por defecto el directorio D:\Inetpub\scripts en el servidor Microsoft Personal Web Server 4.0. Como se puede apreciar, estn activos los permisos hace falta tener activado el permiso
Unix,
el
22
CGI
, lo que plantea un
38
Captulo 1. CGI
1.13. Seguridad
39
CGI ya compilados: pueden esconder un caballo de Troya 23 o una puerta trasera (backdoor ) de entrada a nuestro sistema. Por ejemplo, un programa CGI puede realizar una funcin dada benigna, pero adems, sin
de los programas que nadie se entere, puede enviar a su creador el chero que se ejecute.
cdigo para comprobar qu hace y cmo lo hace realmente. No hay que arse
Este problema tambin se puede dar cuando usamos libreras de cdigo de origen desconocido. Aunque sea una librera conocida, hay que descargarla de un sitio de conanza, para evitar que haya sido manipulada previamente.
de un formulario, pero que contenga datos peligrosos. Es peligroso asumir que los datos que recibe el lario
23
Un caballo de Troya es una aplicacin maligna que se camua como un programa que
realiza una funcin benigna, pero que realmente realiza una serie de tareas ocultas sin que el usuario se de cuenta. Al contrario que los virus, los caballos de Troya no se replican ni infectan otros cheros, pero pueden ser tan destructivos como ellos.
24 25
Se puede crear un programa que haga cosas que no puede hacer un navegador, como Por ejemplo,
CGI
40
Captulo 1. CGI
peticin buers
HTTP directa. El exceso de datos produce desbordamientos de (buer overrun ), que pueden bloquear el sistema o permitir el
POST,
es conveniente vericar su longitud a travs de
CONTENT_LENGTH.
Tambin es un error suponer que los caracteres especiales en los datos han sido codicados por el navegador mediante las secuencias %xx. En denitiva, un programa
tos de entrada que contienen basura, estn vacos, son aleatorios o superan el tamao mximo esperado. Evidentemente, tanta prevencin tiene un inconveniente: el cdigo del programa aumenta considerablemente y el mantenimiento futuro es ms complicado.
CGI tiene que rechazar aquellos datos que no CGI debe vericar la CGI tiene
que rechazar aquellos datos que contengan un salto de lnea (ms de una lnea). Si un formulario incluye listas desplegables, cuadros de vericacin o botones de radio, el programa
CGI
26 :
26
1.13. Seguridad
41
\).
No contiene dos puntos (:), subrayado (_) o cualquier otro carcter especial. Tiene una longitud mxima. Para vericar que unos datos son vlidos, se pueden tomar dos soluciones: vericar que contiene caracteres vlidos o vericar que no contiene caracteres no vlidos. Es preferible emplear la primera alternativa, ya que si se emplea la segunda es probable que se olvide comprobar algn carcter no vlido. El siguiente cdigo en
como argumentos dos punteros a cadenas: la primera cadena contiene los datos de entrada que se quieren validar y la segunda los caracteres aceptados. La funcin devuelve un puntero a la primera cadena con los caracteres no aceptados eliminados.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
char *stripchars(char *cadena, const char *acepta) { char flags[256], *chr, *pos; int n; /* Tabla de flags que indica si un caracter es aceptado */ for(n = 0; n < 256; n++) flags[n] = 0; for(chr = acepta; *chr != '\0'; chr++) flags[*chr] = 1; /* Sobre la propia cadena, copia unicamente los caracteres validos */ for(chr = cadena, pos = cadena; *chr != '\0'; chr++) { *pos = *chr; pos += flags[*chr]; } *pos = '\0'; } return cadena;
Ejemplo 1.19
42
Captulo 1. CGI
datos no contienen ningn carcter especial que pueda producir un error: no se sabe como va a responder el programa externo ante datos inadecuados. Cuando se empleen programas externos hay que indicar de forma explcita la ruta al programa, y no conar en que se encuentran en el
PATH. Si no se lleva
cuidado, puede ser que se ejecute el programa que no es (incluso un programa que haya colocado una persona maliciosa en nuestro servidor).
<!-- #include file="/etc/passwd" --> para visualizar el chero de contraseas o <!-- #exec cmd="rm -rf /" --> para borrar todo el sistema de archivos.
Existen dos soluciones para evitar este problema: 1. Impedir que el usuario pueda introducir los caracteres introducir su entrada o automticamente se eliminan. 2. Traducir los dos caracteres a sus respectivos cdigos de escape:
<
>.
Si el usua-
<
>
para
>.
< para
1.13. Seguridad
43
cco al que se le pueda asignar privilegios concretos (normalmente, para ello el servidor web se tiene que ejecutar con ese usuario).
CGI nunca termine: varios programas CGI en un CGI una prioridad menor
bucle innito pueden colapsar y bloquear un servidor web. Para evitar estas situaciones, es conveniente asignar a los programas programa, no bloquear el sistema. que el resto de procesos: de este modo, aunque nunca termine de ejecutarse un
rewall ).
CGI
en el mismo
directorio donde reside el ejecutable. Si se dispone del cdigo fuente es ms fcil localizar posibles agujeros de seguridad. Desgraciadamente, en aquellos casos en los que se emplea algn lenguaje interpretado ( es posible evitar este problema. Adems, si sabes que tu programa
CGI
lo indiques con un comentario en el cdigo fuente. Si cae en manos ajenas, el atacante slo necesita seguir las instrucciones que has dejado.
44
Captulo 1. CGI
1.14.
WinCGI
Windows 3.1. En aquella poca, el lenguaje de programacin ms empleado en ese sistema operativo era Microsoft Visual Basic. Para facilitar la programacin 27 de CGI mediante Microsoft Visual Basic , Bob Denny creo un interfaz de
programacin similar a
Microsoft
Poco despus, el servidor de Bob Denny fue comprado por O'Reilly &
Associates y se ha comercializado desde entonces con el nombre de
WebSite Professional29 .
O'Reilly
la informacin a travs de variables de entorno, en WinCGI la informacin se pasa mediante los tpicos cheros se realiza a travs de cheros (
Microsoft Windows.
CGI y viceversa)
El intercambio
Cuando el servidor web ejecuta un programa WinCGI, le pasa un nico parmetro que indica la localizacin del chero dene que en un chero de parejas
.ini. La especicacin WinCGI .ini existen ocho secciones y cada seccin se compone clave = valor:
las variables o
Query String.
CGI
usuales, como
Request Protocol,
[Accept]. Indica los tipos MIME que el cliente comunica que acepta en
HTTP.
[System].
Content File que indica el chero que contiene enviada por el cliente y Output File que indica
27
Este lenguaje presentaba en sus primeras versiones varios inconvenientes que impedan
CGI
, como la dicultad que planteaba a la hora de acceder , slo existe una especicacin inforha cedido los derechos de su
28 29
Deerfield.com
1.14. WinCGI
45
campo=valor.
[Form External]. Si alguno de los valores recibidos supera los 254 caracteres o contiene caracteres de control, se almacena en un chero temporal y en esta seccin se indica la localizacin del chero.
30 ,
en esta seccin se indica la localizacin de los cheros recibidos. Si los datos recibidos superan los 65 535 bytes, el servidor
web no los descodica, pero en esta seccin indica la localizacin de cada valor en el chero indicado por
Content File.
30
<INPUT TYPE="FILE">.