You are on page 1of 128

NOTA DEL AUTOR

Este libro fue publicado originalmente con copyright (todos los derechos reservados) por el autor y el editor. La publicacin actual de este libro se realiza bajo la licencia Creative Commons Reconocimiento-NoComercialSinObrasDerivadas 3.0 Espaa que se resume en la siguiente pgina. La versin completa se encuentra en la siguiente direccin:

http://creativecommons.org/licenses/by-nc-nd/3.0/es/legalcode.es

Creative Commons

Creative Commons License Deed


Reconocimiento-NoComercial-SinObraDerivada 3.0 Espaa (CC BY-NC-ND 3.0)

Usted es libre de:

copiar, distribuir y comunicar pblicamente la obra

Bajo las condiciones siguientes:


Reconocimiento Debe reconocer los crditos de la obra de la manera especificada por el autor o el licenciador (pero no de una manera que sugiera que tiene su apoyo o apoyan el uso que hace de su obra). No comercial No puede utilizar esta obra para fines comerciales.

Sin obras derivadas No se puede alterar, transformar o generar una obra derivada a partir de esta obra.

Entendiendo que:
Renuncia Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los derechos de autor Dominio Pblico Cuando la obra o alguno de sus elementos se halle en el dominio pblico segn la ley vigente aplicable, esta situacin no quedar afectada por la licencia. Otros derechos Los derechos siguientes no quedan afectados por la licencia de ninguna manera: Los derechos derivados de usos legtimosu otras limitaciones reconocidas por ley no se ven afectados por lo anterior. Los derechos morales del auto; Derechos que pueden ostentar otras personas sobre la propia obra o su uso, como por ejemplo derechos de imagen o de privacidad. Aviso Al reutilizar o distribuir la obra, tiene que dejar bien claro los trminos de la licencia de esta obra.

Esto es un resumen legible por humanos del texto legal (la licencia completa) disponible en los idiomas siguientes: Asturian Castellano Cataln Euskera Gallego

Programacin de servidores web con CGI, SSI e IDC

Sergio Lujn Mora

Prefacio
Las aplicaciones web (

web-based application )

se clasican dentro de las

aplicaciones cliente/servidor. Por un lado, se tiene el navegador (

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

en Java, mientras que para programar un

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

Internet: Clientes Web

Programacin en

que he publicado en Editorial Club Universitario. 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

C, por lo que es C o C++ para comprenderlos.

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).

Alicante, 11 de noviembre de 2001

Sergio Lujn Mora

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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Razones para emplear CGI

Razones para no emplear CGI . . . . . . . . . . . . . . . . . . . El primer CGI . . . . . . . . . . . . . . . . . . . . . . . . . . .

Cmo comunicarse directamente con el cliente . . . . . . . . . . . . . . . . . . . .

1.10. Cmo enva el servidor informacin a un CGI

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

1.10.5. A travs de informacin de ruta . . . . . . . . . . . . . . 1.11. Variables de entorno CGI . . . . . . . . . . . . . . . . . . . . .

26 26 26 27 28 29 31 36 36 39 39 39 40 40 42 42 42 43 43 43 43 44

1.11.1. Especcas del servidor . . . . . . . . . . . . . . . . . . . 1.11.2. Especcas del cliente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.11.3. Especcas de la peticin

1.11.4. Cmo acceder a las variables desde C . . . . . . . . . . . 1.12. Un ejemplo ms complejo 1.13. Seguridad . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

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 . . . . . . . . . . . . . .

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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Ejemplo de programa SSI

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 . . . . . . . . . . . . . . . . . . . . . . . . . .

A. Cmo crear un DSN


A.1. ODBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A.2. Creacin de un DSN . . . . . . . . . . . . . . . . . . . . . . . .

87
87 91

Bibliografa ndice alfabtico

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

Tipos MIME ms comunes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Caracteres especiales en la codicacin URL . . . . . . . . . . . Modicadores de timefmt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Ejemplos de distinto formato fecha

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

Formulario de toma de datos para insercin

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 Active Server Pages


Pginas activas de servidor. Tecnologa de Microsoft que permite crear pginas web dinmicas en el servidor. Se puede decir que las pginas programadas en lenguajes.

ASP son similares a los programas CGI. Las pginas ASP suelen estar

VBScript, aunque tambin se pueden programar en otros

ASCII American Standard Code for Information Interchange


Cdigo binario utilizado para representar letras, nmeros, smbolos, etc. A cada carcter se le asigna un nmero del 0 al 127 (7 bits). Por ejemplo, el cdigo

ASCII

para la A mayscula es 65. Existen cdigos

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

de uno a otro. Por ejemplo, uno de los ms extendidos es

ISO

Latin-1

CGI Common Gateway Interface


Interfaz de pasarela comn. Estndar que permite el intercambio de informacin entre un servidor y un programa externo al servidor. Un programa

CGI es un programa preparado para recibir y enviar datos desde


xiii

y hacia un servidor web segn este estndar. Normalmente se programan

xiv

ndice de acrnimos

en

o en

Perl, aunque se puede usar cualquier lenguaje de propsito

general.

DLL Dynamic Link Library


Librera de enlace dinmico. Fichero que almacena funciones ejecutables o datos que pueden ser usados por una aplicacin en Una tiempo de ejecucin (no en tiempo de compilacin).

DLL puede ser usada por varios programas a la vez y se carga en

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 Data Source Name


Nombre de origen de datos. Un

DSN

representa toda la informacin

necesaria para conectar una aplicacin con una base de datos mediante

ODBC.

HTML HyperText Markup Language


Lenguaje de etiquetado de hipertexto. Lenguaje compuesto de una serie de etiquetas o marcas que permiten denir el contenido y la apariencia de las pginas web. Aunque se basa en

SGML, no se puede considerar que

sea un subconjunto. Existen cientos de etiquetas con diferentes atributos.

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

HTTP 1.1. Una de las prin-

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

la transmisin hasta en un 20 %. Se puede consultar el estndar en 2616 (junio 1999).

RFC

IDC Internet Database Connector


Conector de bases de datos de Internet. Tecnologa propietaria de Microsoft que permite generar pginas web dinmicas a partir de la in-

formacin almacenada en una base de datos. Es el precursor de

ASP.

IP Internet Protocol
Protocolo de Internet. Protocolo bsico de Internet perteneciente a la familia

TCP/IP. Especica el formato de los paquetes (datagramas) y

el esquema de direccionamiento.

ISAPI Internet Server Application Program Interface


Un API para el servidor programar aplicaciones web.

Microsoft Internet Information Server.

Permite

ISO International Organization for Standards


Organizacin fundada en 1946, cuyos miembros son las organizaciones nacionales de normalizacin (estandarizacin) correspondientes a los pases miembros. Entre sus miembros se incluyen la ANSI (Estados Unidos), BSI (Gran Bretaa), AFNOR (Francia), DIN (Alemania) y UNE (Espaa).

JSP Java Server Pages


Tecnologa de Sun Microsystems que permite crear pginas web dinmicas en el servidor. Equivale a la tecnologa programan en

Java.

ASP de Microsoft. Se

MIME Multipurpose Internet Mail Extensions


Se usa en el correo electrnico desde 1992 para enviar y recibir cheros de distinto tipo. Se puede consultar el estndar en y

RFC 1522.

RFC 1341, RFC 1521

ODBC Open Database Connectivity


Conectividad abierta de bases de datos.

ODBC es un estndar de facto

para el acceso a base de datos en entornos cliente/servidor. Mediante

ODBC, se puede cambiar la parte servidor (la base de datos) sin tener
que cambiar el cliente.

xvi

ndice de acrnimos

RFC Request for Comments


Medio de publicar propuestas sobre Internet. Cada

RFC recibe un n-

mero. Algunos se convierten en un estndar de Internet.

SGBD Sistema Gestor de Bases de Datos


Programa (o programas) que permite almacenar, modicar y extraer informacin contenida en una base de datos. Los modelo relacional, en red, jerrquico, etc.

SGBD se pueden cla-

sicar segn la forma que tienen de almacenar internamente los datos:

SGML Standard Generalized Markup Language


Lenguaje que permite organizar y etiquetar los distintos elementos que componen un documento. Se emplea para manejar grandes documentos que sufren constantes revisiones y se imprimen en distintos formatos. Desarrollado y estandarizado por

ISO en 1986 (ISO 8879:1986).

SQL Structured Query Language


Structured English Query Language ), diseado por IBM en 1974. Existen distintas versiones, siendo la
a bases de datos. Basado en SEQUEL ( ms conocida SQL-92 y la ltima publicada y estandarizada SQL-1999. Lenguaje de consulta estructurado. Lenguaje estandarizado de acceso

SSI Server Side Include


Directivas de inclusin del servidor. Comandos que se incluyen en una pgina mitir la pgina al cliente. Permite generar pginas web dinmicas.

HTML y que son ejecutados por el servidor web antes de trans-

TCP/IP Transmission Control Protocol/Internet Protocol


Familia de protocolos que se emplean en las comunicaciones de Internet.

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.

W3C World Wide Web Consortium


Consorcio internacional de compaas involucradas en el desarrollo de Internet y en especial de la

WWW. Su propsito es desarrollar estn-

dares y poner orden en 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.

XML Extensible Markup Language


te para la (sintaxis).

Metalenguaje de etiquetado basado en

SGML. Diseado especcamenWWW por W3C. Permite que un usuario disee sus propias

etiquetas, con sus atributos y las reglas de construccin de documentos

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

Aplicaciones . . . . . . . . . . . . . . . . . . . . . . . . Qu necesito para programar un CGI . . . . . . . .

Lengua je de programacin . . . . . . . . . . . . . . .

1.5.1. Independencia de plataforma . . . . . . . . . . . . . 1.5.2. Independencia de servidor . . . . . . . . . . . . . . .


1.6. 1.7. 1.8. 1.9. Razones para emplear CGI . . . . . . . . . . . . . . Razones para no emplear CGI . . . . . . . . . . . . . El primer CGI . . . . . . . . . . . . . . . . . . . . . .

8 8
9 10 11 17 17

Cmo comunicarse directamente con el cliente . . . . . .

1.10. Cmo enva el servidor informacin a un CGI

1.10.1. A travs de la lnea de comandos . . . . . . . . . . . 18 1.10.2. Cmo tratar los formularios . . . . . . . . . . . . . . 22


1

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

1.11.1. 1.11.2. 1.11.3. 1.11.4.

Especcas del servidor . . . . . . . . Especcas del cliente . . . . . . . . . Especcas de la peticin . . . . . . . Cmo acceder a las variables desde C

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

26 27 28 29
31 36

1.12. Un ejemplo ms complejo 1.13. Seguridad

. . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . .

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

Common Gateway Interface (CGI)


es necesario el estndar

informacin entre un servidor web y un programa externo al servidor. Por qu

CGI? Si queremos acceder desde un servidor web a una

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

CGI se establece un conjunto de normas (protocolo) que deben de CGI:

1.

El cliente web (el navegador) lanza una peticin nueva mediante

Text Transfer Protocol (HTTP). Est peticin puede ir acompaada de


datos codicados por el navegador (por ejemplo, informacin introducida por el usuario en un formulario).

Hyper-

2.

El servidor web recibe la peticin, analiza la ( le pasa los datos codicados.

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

interacta con otras aplicaciones que son

las verdaderas destinatarias de los datos recibidos, como por ejemplo, un

Sistema Gestor de Bases de Datos (SGBD)).


4. El programa

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 web.

CGI.

Ms adelante veremos que se puede evitar este procesamiento y hablar directamente

al cliente.

Captulo 1.

CGI

Figura 1.1: Esquema bsico de una aplicacin web basada en CGI

El uso de

CGI

supone un aumento en la complejidad de los sitios web,

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.

Las principales diferencias

Pgina HTML
El servidor web pgina El contenido es

esttico

CGI

ejecuta el prodin-

El contenido puede ser

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

CGI y lo ejecuta pasndole el trmino a buscar. Adems del

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.

Internet Protocol (IP) del cliente, mtodo que

CGI

realiza una bsqueda en una base de datos (o en un

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.

CGI genera HTML nueva a partir de la CGI al nave-

1.3.

Aplicaciones

El uso de programas

CGI permite incorporar interaccin en un sitio web: en CGI son mltiples:

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 (

guestbook ). Mediante un CGI se

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 (

banners ). Mediante un CGI se pueden mostrar de

forma aleatoria o de forma prejada (por ejemplo, segn la hora del da ciones de enlace. Adems, se puede controlar el nmero de pulsaciones

IP del cliente) distintos anuncios con distintas direc-

clicks ) que recibe cada anuncio.

Normalmente se conoce por sus siglas: IIS.

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.

CGI como gateway ) para acceder a una base de datos.

De este modo, se pueden crear aplicaciones como buscadores, comercio

1.4.

Qu necesito para programar un CGI

Para poder programar un gramas:

CGI

y probarlo hacen falta los siguientes pro-

Un editor de textos como

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.

CGI mediante un lenguaje compilado (C , C++,

Un servidor web (ya sea local o remoto) en el que se puedan ejecutar programas

Internet Information Server net Explorer

CGI.

Por ejemplo, o

Microsoft Personal Web Server, Microsoft Apache. Netscape Communicator o Microsoft Inter-

Por ltimo, un navegador como

CGI.
3

para poder comprobar las pginas

HTML y los programas

Tambin existen las imgenes sensibles procesadas en el cliente.

1.5. Lenguaje de programacin

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.

syntax highlight . Esta

1.5.

Lenguaje de programacin

Como un

CGI

es un programa que se ejecuta en el servidor, se puede

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,

C y Perl son los lenguajes ms empleados a la hora de programar CGI.


scripts 4 ,
Por razones histricas, a los programas

CGI

se les suele llamar tambin

porque al principio se programaban con lenguajes de

gente preere escribir los programas

CGI

con lenguajes de

script. Mucha script en vez 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

Python, Fortran, Pascal, TCL o en nuestro lenguaje favorito).


Como la tecnologa

CGI (la lista no es excluyente: nada nos impide programar un CGI CGI se encuentra muy extendida en el mundo Internet,

existen multitud de libreras en los distintos lenguajes de programacin que

Normalmente, se emplea la palabra programa para denotar aplicaciones y cdigo largo

y compilado mientras que script hace referencia a cdigo corto y no compilado.

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

Cuadro 1.2: Lenguajes de programacin ms comunes

facilitan la creacin de programas (

C++), etc.

CGI: cgi-lib (Perl ), CGI-HTML (C ), AHTML

1.5.1. Independencia de plataforma


La independencia de plataforma implica la capacidad de ejecutar el cdigo de un

CGI en distinto hardware o software

(sistema operativo) sin tener que

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

C y Perl, que estn disponibles

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.

1.5.2. Independencia de servidor


La independencia de servidor signica que el cdigo se puede ejecutar en distintos servidores web sobre el mismo sistema operativo sin tener que modicarlo. Esta independencia es ms sencilla de conseguir que la anterior, pero hay que observar una serie de recomendaciones: No asumir que el programa se ejecutar en un directorio concreto. No asumir que algunos directorios se hallan siempre en la misma ruta. Por ejemplo, suponer que el directorio temporal se encuentra siempre en

1.6. Razones para emplear CGI

C:\TEMP WWWROOT

o que el directorio principal del servidor web es es muy peligroso.

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

IP, dominios, etc.

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

que hemos desarrollado, para

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.

Razones para emplear CGI

En los primeros aos de la era web (1992-1997),

CGI

era la nica posi-

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:

CGI? Existen diversas

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

Active Server Pages (ASP), Java Server

son la mejor solucin, debido a la sobrecarga que

supone ejecutar una aplicacin externa al servidor web.

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.

CGI es un estndar compatible con todos los clientes web.

10

Captulo 1. CGI

4.

Un programa un

CGI se puede escribir prcticamente en cualquier lenguaje.

Por tanto, si se conoce un lenguaje de programacin, se puede escribir

CGI desde el primer da.

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.

Razones para no emplear CGI

Como se ha comentado en el apartado anterior, existen una serie de ventajas a la hora de emplear inconvenientes: 1.

CGI. Sin embargo, el estndar CGI tambin tiene sus

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.

market cart) o lectores de webmail ). Para resolver esta carencia, se suelen


6

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

id ) que permite seguir su

CGI y el servidor web es muy dbil.


7

La nica comunicacin que se establece entre ambos es para transmitir los datos de entrada y la salida producida por el programa .

Est es una limitacin que se debe realmente al protocolo

protocolo

recurso (una pgina

HTTP

es un protocolo sin estado (stateless ): cada vez que un cliente solicita un

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

, por ejemplo) al servidor web, es como si fuera la primera vez

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

en distintos servidores web.

CGI

bien hecho es independiente de la plataforma y se puede usar sin problemas

1.8. El primer CGI

11

4.

Cada vez que se tiene que ejecutar un programa tancia nueva del programa en memoria.

CGI, se crea una ins-

1.8.

El primer CGI

la salida estndar (stdout). Un programa

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

8 lo pueden procesar adecuadamente. El tipo del documento se ex-

message, application, image, audio, video)


Cuadro 1.3 se muestran los tipos ciadas a esos tipos.

MIME. Los tipos MIME bsicos (text, multipart,


se dividen en subtipos. En el

MIME ms comunes y las extensiones aso-

American Standard Code for Information Interchange (ASCII) separadas en9


cuerpo del mensaje de respuesta. A continuacin viene el cuerpo de la respuesta, que puede estar en cualquier formato (texto una imagen, archivo de sonido, etc.). Por ejemplo, la salida que tiene que generar un programa una pgina

La cabecera de la respuesta se compone de una serie de lneas con texto

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

ASCII, formato binario para CGI para enviar

HTML sencilla con la frase Hola mundo! es:


Ejemplo 1.1

1 2 3 4 5

Content-type: text/html <HTML> <BODY> Hola mundo!


8

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

y un salto de lnea (CR

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

Cuadro 1.3: Tipos MIME ms comunes

1.8. El primer CGI

13

6 7

</BODY> </HTML>

En la primera lnea se indica el tipo El formato que se emplea es se trata de una pgina

HTML empleamos text/html. A continuacin, como

Content-type: tipo MIME.

MIME del contenido de la respuesta.


En este caso, como

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

C genera como salida la pgina HTML anterior10. La lnea en


de la lnea 6; esta instruccin se ha dejado en una

CGI

blanco que separa la cabecera del cuerpo de la respuesta se crea mediante la

printf("\n");

lnea sola a propsito.

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; }

Por otro lado, no confundir el salto de lnea lnea

<BR>

del cdigo

HTML. Las tres instrucciones que generan el cdigo de


Ejemplo 1.3

\n

con la instruccin salto de

la respuesta se pueden resumir en una sola sin ningn salto de lnea:

printf("<HTML><BODY>Hola mundo!</BODY></HTML>");
10

...).

Para generar la salida, se puede emplear la instruccin

printf(...) o fprintf(stdout,

14

Captulo 1. CGI

11 si lo visualizamos directamente desde el navegador .


Otra posibilidad que se ofrece es redirigir (

Los saltos de lnea los incluimos para facilitar la lectura del cdigo

HTML

12 pgina . En vez de generar el documento de salida, se puede simplemente


indicar al cliente web donde puede encontrarlo. Para ello se emplea el formato

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).

Por ello, es conveniente, tal como se ha hecho en el

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

Netscape Communicator: botn derecho del ratn y elegir

net Explorer: botn derecho del ratn y seleccionar acceder a travs de los mens.

View Source Ver cdigo fuente

; 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.

1.8. El primer CGI

15

3 4 5 6 7 8

int main(int argc, char *argv[]) { printf("Location: http://www.ua.es\n"); printf("\n"); return 0; }

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

ternet Explorer 5.5 printf("\n"); de

cuando en el programa la lnea 6.

CGI

Microsoft In-

anterior se elimina la lnea

Figura 1.2: Mensaje de error porque el encabezado no es correcto

Existe una ltima directiva que permite a un programa

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

Cuadro 1.4: Cdigos de estado HTTP ms usuales

1.9. Cmo comunicarse directamente con el cliente

17

1.9.

Cmo comunicarse directamente con el cliente

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

Para que el servidor web sepa distinguir unos programas

CGI

de otros,

cuando se desee hablar directamente con el cliente, el nombre del programa

CGI debe comenzar por nph-13 . Por ejemplo, las siguientes instrucciones representan un mensaje HTTP correcto:
1 2 3 4 5 6 7

HTTP/1.0 200 OK Server: IIS/4.0 Content-type: text/html

Ejemplo 1.6

<HTML><BODY> Esto es un mensaje HTTP correcto </BODY></HTML>

1.10.

Cmo enva el servidor informacin a un CGI

Un programa

CGI

puede recibir informacin desde un servidor web de

cuatro formas distintas: A travs de la lnea de comandos ( A travs de la

command line ).

URL (QUERY_STRING).

A travs de la entrada estndar (stdin). A travs de informacin de ruta (PATH_INFO). Un programa

CGI

tiene que saber como va a recibir la informacin, ya

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

URL (tambin llamado mtodo GET) y a travs


POST).

13

No Parse Header : no se debe analizar la cabecera.

18

Captulo 1. CGI

1.10.1. A travs de la lnea de comandos


La lnea de comandos se emplea nicamente en el caso de una bsqueda

ISINDEX.

En estas consultas, el programa

CGI

recibe una lista de trminos

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.

ISINDEX al ISINDEX o directa-

La sintaxis de la etiqueta

ISINDEX

es:

<ISINDEX PROMPT="texto">
donde

Ejemplo 1.7

texto

es el texto que acompaa al cuadro de texto que el usuario

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

HTML (<HEAD> ... </HEAD>). En HTML que contiene esta

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

1.10. Cmo enva el servidor informacin a un CGI

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

C es un programa CGI que muestra la primera vez

CGI.

HTML de la Figura 1.4. En la Figura 1.3 podemos

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

#include <stdio.h> #include <stdlib.h> #include <string.h>

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");

1.10. Cmo enva el servidor informacin a un CGI

21

42 43 44 45 46 47 48 49 50 51

} }

} else printf("El nombre de ciudad <I>%s</I> no es correcto", argv[1]); printf("</BODY>\n</HTML>\n");

printf("Lluvias durante todo el da. "); printf("Riesgo alto de granizo y nieve.");

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 (+)

Otra forma de realizar consultas

ISINDEX

es directamente a travs de la

CGI: separado por el signo interrogacin (?), se escriben los trminos de


15 .

15

Ms adelante veremos que el signo ms se emplea para codicar los espacios en blanco

en la

URL

22

Captulo 1. CGI

Figura 1.5: Pgina de respuesta a una bsqueda ISINDEX

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

por la lnea de comandos. Esto no ocurre si el signo igual se escribe en el

16 .

ISINDEX,

ya que el navegador se encarga de

1.10.2. Cmo tratar los formularios


Los dos siguientes mtodos (a travs de la estndar) permiten que un programa

CGI

URL y a travs de la entrada

reciba los datos introducidos por

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

CGI con el siguiente formato:

control1=valor1&control2=valor2&...&controln=valorn
16
El cdigo del signo igual es %3D.

Ejemplo 1.10

1.10. Cmo enva el servidor informacin a un CGI

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

aparecer de todas formas la correspondiente cadena valor asociado.

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  &,  

17 . Esta codicacin se conoce como codicacin URL (URL

%

%,  $

o  , se codican usando el smbolo

y si aparecen caracteres

seguido de dos dgitos que expresan, en hexadecimal, su cdigo se codicara como 

caping ). Por ejemplo, la cadena  & %$

%26 %25 %24 %F1.

ASCII encoding o es-

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

CGI debe realizar la descodicacin de la entrada


control=valor.
Para ello, hay

que dividir los datos recibidos cada vez que se encuentre un un usuario introduce un 2.

(&). No hay peligro de confundirse con la entrada del usuario, ya que si

ampersand

ampersand, se enva codicado ( %26).

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 (+).

Se codican los caracteres con un cdigo

ASCII

menor de 33 (21 hexadecimal) o mayor

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

Cuadro 1.5: Caracteres especiales en la codicacin URL

1.10.3. A travs de la URL


Este mtodo se emplea cuando se usa un formulario envo

GET

o directamente a travs de la

informacin codicada 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

URL), tenemos que URL,


los datos

CGI

mediante un signo de interrogacin (?). Por ejemplo, si

URL,

separados del nombre

queremos que al pulsar sobre un enlace se llame al programa pase la palabra

subtotal,

cgi.exe

y se le

pondremos:

<A HREF="cgi.exe?subtotal">Ver subtotal</A>


18
En la mayora de los navegadores, el mtodo de envo por defecto es

Ejemplo 1.12

formulario no se indica el mtodo con el atributo

METHOD,

se asume el mtodo

GET: si GET.

en un

1.10. Cmo enva el servidor informacin a un CGI

25

Tambin existe el mtodo mtodo

HEAD slo las cabeceras HTTP (y no el cuerpo del mensaje) se envan

HEAD,

similar al mtodo

GET,

excepto que con el

desde el servidor web hacia el navegador.

1.10.4. A travs de la entrada estndar


Este mtodo se emplea cuando se usa un formulario con el mtodo de envo entrada estndar (stdin) (el navegador se encarga de codicar la informacin que introduce el usuario en el formulario). El servidor web no tiene la obligacin de enviar una marca de nal de chero (EOF) al nal de los datos. Para saber cuntos datos hay que leer de la entrada, se tiene que consultar la variable de entorno

POST.

El programa

CGI recibe la informacin codicada a travs de la

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

de interrogacin (?) y algo ms. Por ejemplo, en el siguiente formulario, se

CGI aparezca un signo

URL:

POST,

pero tambin se pasa informacin

1 2 3

<FORM ACTION="cgi.exe?id=es" METHOD="POST"> Nombre: <INPUT TYPE="TEXT" NAME="nombre"> </FORM>


La ventaja principal del mtodo

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

URL (1024 bytes normalmente) o por


REQUEST_METHOD.

el tamao mximo de una variable de entorno en el sistema operativo.

POST

CGI puede saber si se le han enviado los datos mediante GET

consultando la variable de entorno

26

Captulo 1. CGI

1.10.5. A travs de informacin de ruta


Tambin existe otra forma de enviar datos al programa a travs de la grama

CGI.

CGI desde el cliente URL, incluyendo informacin extra en la va de acceso al proCGI recibe la informacin extra en la variable de

Esta informacin adicional no se codica de ninguna manera.

En este caso, el programa entorno

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

CGI, aunque se puede emplear para otros CGI llamado cgi-orden.exe

que es capaz de ordenar las lneas de un chero y mostrar el resultado en una

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.

Variables de entorno CGI

CONTENT_TYPE, PATH_INFO, QUERY_STRING y REQUEST_METHOD), el servidor web


asigna valor a otras variables cuando ejecuta el programa

Adems de las variables de entorno que hemos visto (CONTENT_LENGTH,

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

podemos acceder a las pertenecientes al sistema operativo, como

PATH, TEMP,

CGI recibe sus propias variables de entorno con sus propios

valores. Se pueden ejecutar concurrentemente varios programas sin problemas, ya que cada uno recibir su propia copia de las variables de entorno.

1.11.1. Especcas del servidor


Estas variables comunican al programa

CGI caractersticas sobre el servi-

dor web en que se est ejecutando. Normalmente, se sabe en que servidor se

1.11. Variables de entorno CGI

27

est ejecutando un programa

CGI, as que ests variables se suelen usar poco.


CGI/1.1.

GATEWAY_INTERFACE. SERVER_NAME.
(

El nombre y la versin de la especicacin

CGI

utilizada por el servidor. El formato es CGI/versin. Ejemplo: El nombre del servidor, el alias

DNS)

o la direccin

IP

tal como aparecera en las direcciones

que hacen referencia a s mismas. Ejemplo:

www.ua.es.

Domain Name System URL

SERVER_PORT.
peticin

HTTP. Ejemplo: 8019 .


HTTP/1.1.

El nmero de puerto en el que el servidor ha recibido la

SERVER_PROTOCOL.
Ejemplo:

El nombre y la versin del protocolo empleado por

el servidor para procesar las peticiones. El formato es protocolo/versin.

SERVER_SOFTWARE.
Ejemplo:

El nombre y la versin del software del servidor que

responde a la peticin y que ejecuta el

Microsoft-IIS/4.0.

CGI. El formato es nombre/versin.

1.11.2. Especcas del cliente


Mediante estas variables, el servidor web informa al programa

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

toda la informacin posible.

HTTP_ACCEPT.

Enumera los tipos de respuesta que acepta el cliente. El

image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*.


formato es tipo/subtipo, tipo/subtipo, ... Ejemplo:

HTTP_ACCEPT_ENCODING.
19 20

Identica los tipos de esquemas de codicacin

que acepta el cliente. Ejemplo:

gzip, deflate.

El puerto 80 es el puerto por defecto para comunicaciones En la cabecera

biado.

HTTP

, pero puede ser cam-

especcas del cliente aparece realmente como un guin

HTTP

, el signo de subrayado

_ de los nombres de las variables de entorno -. Adems, todos los caracteres se

han pasado a maysculas en el nombre de la variable de entorno.

28

Captulo 1. CGI

HTTP_ACCEPT_LANGUAGE. Enumera los cdigos International Organization

for Standards (ISO)


recibir. Ejemplo:

de los lenguajes que el cliente entiende y espera

es-ES,en,pdf. http://www.ua.es/-

HTTP_REFERER. index.html.

Identica la URL del documento que contiene el en-

lace que apunta al documento actual. Ejemplo:

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).

1.11.3. Especcas de la peticin


AUTH_TYPE.
El mtodo de autenticacin que el servidor utiliza para validar a los usuarios cuando intentan tener acceso a un programa de usuario y una contrasea. Ejemplo:

CGI

protegido. Normalmente la autenticacin se realiza mediante un nombre

BASIC.

AUTH_USER.

Nombre de usuario autenticado.

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.

MIME de los datos enviados por el cliente web


Esta variable est vaca cuando el mtodo

Ejemplo:

application/x-www-form-urlencoded.

PATH_INFO.
Ejemplo:

Informacin adicional de ruta para el programa

da como parte de la

/myhome.

URL,

CGI pasa-

a continuacin del nombre del programa.

PATH_TRANSLATED. QUERY_STRING.

La versin traducida de

se convierte en ruta fsica. Ejemplo:

PATH_INFO. La ruta virtual D:\Inetpub\wwwroot\myhome.

Informacin de consulta almacenada en la cadena que

sigue al signo de interrogacin (?) en la

URL.

1.11. Variables de entorno CGI

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

REMOTE_USER. Nombre del usuario remoto, si el usuario se ha autenticado


correctamente.

REQUEST_METHOD. El mtodo que se ms usuales son HEAD, GET y POST. SCRIPT_NAME.


Ejemplo:

utiliza para hacer la peticin. Los

La ruta virtual al programa

Esta variable es til en los programas

/scripts/cgivar.exe.

CGI que se est ejecutando. CGI que se llaman a s mismos21 .

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

En la Figura 1.6 se muestra el valor de algunas de las variables de entorno

Microsoft Internet

1.11.4. Cmo acceder a las variables desde C


Para acceder a las variables de entorno desde

getenv()
es:

que se encuentra en la librera

stdlib.h.

C se puede emplear la funcin


El prototipo de la funcin

char *getenv(const char *name);

Ejemplo 1.15

Por ejemplo, el siguiente cdigo muestra el valor de las variables especcas del servidor mostradas en la Figura 1.6:

21

Por ejemplo, en los programas

cuando se enva. Mediante la variable (GET) del segundo (POST).

CGI

REQUEST_METHOD

que generan un formulario y tambin lo procesan se puede distinguir el primer caso

30

Captulo 1. CGI

Figura 1.6: Ejemplo de variables de entorno

1.12. Un ejemplo ms complejo

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

#include <stdio.h> #include <stdlib.h>

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

El siguiente ejemplo muestra un programa de dos cheros:

cgi-select.c que contiene el cdigo del programa y cgi.data

CGI ms complejo. Se compone

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

CGI, pero en la segunda pgina (Figura 1.8) se muestran dos listas:

Una vez que se elige un valor de la lista, se vuelve a ejecutar el

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

C del programa 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

#include <stdio.h> #include <stdlib.h> #include <string.h>

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); } } }

1.12. Un ejemplo ms complejo

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

1.12. Un ejemplo ms complejo

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.

1.13.1. Permisos de ejecucin


Lo primero que hay que saber es que para que se ejecute un

CGI, ste tiene

que residir en un directorio especial, de forma que el servidor web sepa que

1.13. Seguridad

37

Figura 1.7: cgi-select: pgina 1

tiene que ejecutar el programa en vez de mostrarlo

22 . Adems, de este modo,

un usuario particular no puede colocar un programa

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

Ejecucin y Archivos de comandos. Para que se ejecute un CGI, slo Ejecucin.

22

Si no fuera as, los usuarios podran acceder y descargarse el

grave problema de seguridad.

CGI

, lo que plantea un

38

Captulo 1. CGI

Figura 1.8: cgi-select: pgina 2

Figura 1.9: Permisos de ejecucin en Microsoft Personal Web Server

1.13. Seguridad

39

1.13.2. Examina el cdigo


Si se usa un

CGI programado por otra persona, es conveniente revisar el

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

/etc/passwd cada vez

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.

1.13.3. Versiones estables


Siempre que sea posible, hay que emplear las ltimas versiones estables de los programas empleados. Nada de versiones beta, ya que suelen tener muchos problemas de vulnerabilidad, que adems son publicados en Internet y conoce todo el mundo rpidamente.

1.13.4. Las presunciones son peligrosas


A la hora de tratar los datos de entrada del usuario, las presunciones son muy peligrosas: Suponer que los datos que se reciben provienen de nuestro formulario es un error. Cualquiera puede apuntar un formulario cualquiera a nuestro programa

CGI o generar una peticin HTTP24 que parezca el resultado CGI


se pueden alma-

de un formulario, pero que contenga datos peligrosos. Es peligroso asumir que los datos que recibe el lario

cenar correctamente. Cualquier limitacin que se imponga en un formu-

25 , se puede saltar fcilmente con un formulario distinto o con una

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,

enviar cientos de megabytes a un

<INPUT TYPE="TEXT" MAXLENGTH="10">.

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

acceso en modo superusuario (administrador) al sistema. Si se reciben los datos mediante

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

CGI tiene que estar preparado para esperar da-

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.

1.13.5. Programa defensivamente


A la hora de tratar los datos recibidos, hay que elegir un criterio. Por ejemplo, si un campo de un formulario tiene que contener una direccin de correo electrnico, el programa se ajusten a una direccin de correo electrnico. Si un cuadro de texto tiene un lmite de longitud (MAXLENGTH), los datos recibidos pueden superar dicho valor. El programa longitud de los datos. Si en un campo se espera una nica lnea de texto, el programa

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

tiene que rechazar cualquier dato que no

coincida con los presentados al usuario en el formulario.

1.13.6. Limpia los datos antes de usarlos


Los datos que introduce un usuario hay que limpiarlos o validarlos antes de emplearlos. Por ejemplo, si en un cuadro de texto se espera el nombre de un chero, antes de realizar cualquier operacin que suponga trabajar con un chero hay que vericar que se trata de un nombre de chero vlido. Por ejemplo, vericar que

26 :

26

Las vericaciones dependen del sistema de archivos de cada sistema operativo.

1.13. Seguridad

41

No comienza por un punto. No contiene separadores de ruta (/ o

\).

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

C permite validar el contenido de una cadena. Tiene

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

1.13.7. Limpia los datos antes de pasarlos a otro programa


Es conveniente evitar el tener que pasar datos a otros programas. Si no hay ms remedio porque el programa y pasa los datos a otro programa, es conveniente que el

CGI simplemente acta como pasarela CGI verique que los

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).

1.13.8. Cuidado con HTML


HTML cuando se espera guestbook ); si el usuario introduce en alguno de los campos (por ejemplo, el nombre) cdigos HTML,
Otra posible fuente de problemas es recibir cdigo texto plano. Suponed que tenemos un libro de rmas ( cuando se visualice su entrada en el libro de rmas, no se mostrar como el programador espera, si no que se aplicarn los formatos que el usuario haya introducido. De este modo tan sencillo se pueden insertar enlaces o imgenes de cualquier naturaleza en una web de otra persona. Mucho peor es que inserte algn comando que permita realizar alguna operacin. Por ejemplo, si el servidor web sabe procesar un usuario puede incluir una instruccin como

<!-- #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:

Server Side Include (SSI),

<

>.

Si el usua-

rio los introduce, se le muestra un mensaje de error para que vuelva a

<

&gt;

para

>.

&lt; para

1.13.9. Nivel de privilegio


CGI como un usuario no privilegiado, preferiblemente como un usuario espeSi el sistema operativo lo permite, es recomendable ejecutar los programas

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).

1.13.10. Nivel de prioridad


Hay que evitar que un

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

1.13.11. Usa un ordenador para los CGIs


La mejor solucin para evitar la mayora de los problemas que se han comentado es elegir un ordenador para que sea servidor de no contendr informacin importante y adems no poseer permisos de acceso a los otros ordenadores de la red. De este modo, aunque se produzca un agujero de seguridad, el atacante no podr obtener mucha informacin. Adems, es preferible que este ordenador se encuentre fuera del cortafuegos (

CGI. Este ordenador

rewall ).

1.13.12. Consulta listas de correo y grupos de noticias


En los distintos medios de comunicacin de Internet se puede encontrar informacin sobre agujeros de seguridad, nuevas versiones de software, etc. Toda esa informacin nos puede ayudar a tener un sitio web seguro.

1.13.13. Nunca olvides el cdigo fuente


Nunca hay que dejar el cdigo fuente de un programa

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

Perl, shell de Unix) no

CGI

posee alguna vulnerabilidad, no

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

En 1994, Bob Denny cre el primer servidor web especco para

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

CGI, al que bautiz como WinCGI28 .

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

Este servidor web se encuentra disponible para todos

los sistemas operativos de Microsoft. Mientras que en el estndar

CGI el servidor web pasa al programa CGI


.ini
de

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.

de informacin en ambos sentidos (del servidor al programa velocidad de procesamiento frente a

le spooling ), CGI.

CGI y viceversa)

El intercambio

lo que supone una merma en la

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

[CGI]. Contiene Request Method


el encabezado

Query String.

CGI

usuales, como

Request Protocol,

[Accept]. Indica los tipos MIME que el cliente comunica que acepta en

HTTP.

[System].

Contiene variables que son especcas del estndar WinCGI.

Las ms importantes son los datos de la peticin

Content File que indica el chero que contiene enviada por el cliente y Output File que indica

el chero en el que el programa tiene que almacenar su salida.

27

Este lenguaje presentaba en sus primeras versiones varios inconvenientes que impedan

su uso a la hora de programar a las variables de entorno.

CGI

, como la dicultad que planteaba a la hora de acceder , slo existe una especicacin inforha cedido los derechos de su

28 29

WinCGI no se encuentra estandarizado como Desde el 20 de agosto de 2001,

mal. servidor web a

Deerfield.com

CGI O'Reilly & Associates

1.14. WinCGI

45

[Extra Headers]. Encabezados adicionales que se han encontrado en la


peticin del cliente.

[Form Literal]. Si la peticin se ha enviado mediante POST, el servidor


descodica los datos recibidos y los coloca en esta seccin en forma de parejas

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.

[Form File]. [Form Huge].

Si el formulario contiene controles para enviar cheros

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">.

Captulo 2

SSI
SSI es una tecnologa que permite crear pginas web dinmicas. Se basa en el uso de una serie de comandos que permiten, por ejemplo, incluir en una pgina web el contenido de un chero o el resultado producido por un programa al ejecutarse. Desgraciadamente, no existe un estndar sobre SSI, por lo que cada servidor web puede denir los comandos SSI de diferente forma. Sin embargo, algunos comandos se han convertido en estndar de facto y su comportamiento es idntico (o muy similar) en la mayora de los servidores web.

ndice General
2.1. 2.2. 2.3. 2.4. 2.5. Introduccin . . . . . . . . . . . . . . . . . . . . . . . 48 48 49 50 51 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.

cong . echo . . exec . . astmod fsize . . include .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

51 54 58 59 61 61

47

48

Captulo 2.

SSI

2.6.

Ejemplo de programa SSI

. . . . . . . . . . . . . . .

62

2.1.

Introduccin

por el servidor web antes de ser enviada al cliente. Desgraciadamente,

SSI es una tcnica que permite que una pgina HTML sea interpretada SSI no

se encuentra estandarizado por ningn organismo, as que cada fabricante de servidores web es libre de incluir e interpretar estas directivas como mejor le parezca. Por tanto, lo ms recomendable es consultar la documentacin del servidor web para averiguar qu directivas reconoce y con qu sintaxis. Al principio, de otro archivo

SSI slo permita incluir en una pgina HTML el contenido (de ah su nombre). Pero SSI se ha ido ampliado con ms

comandos: se puede incluir la fecha y la hora actuales, la fecha de la ltima modicacin de la pgina o el tamao de un chero cualquiera. El comando ms potente permite ejecutar un programa externo e incluir su salida en la pgina

HTML.

El uso de archivos incluidos es una forma cmoda de almacenar en un nico archivo informacin que se utiliza en varias pginas. Por ejemplo, se pueden utilizar las directivas en todos los documentos de un sitio web. Suponed que tenemos 300 pginas en un sitio web, y en todas ellas aparece un pie de pgina con la direccin de correo del administrador del sitio web (

SSI para insertar un aviso de copyright o un pie de pgina

webmaster ) y con un enlace a una pgina de ayuda. Si queremos modicar el

pie de pgina (por ejemplo, cambiar la direccin de correo del administrador), habr que ir una por una cambiando todas las pginas. Si se emplea

SSI para

incluir el pie de pgina desde un chero externo, slo habr que realizar las modicaciones en un nico chero, y todas las pginas estarn automticamente actualizadas. Pero no todo son ventajas: el uso de

SSI puede crear un agujero de segu-

ridad y adems puede reducir el rendimiento del servidor web.

2.2.

Qu necesito para programar mediante SSI

Para poder programar mediante programas:

SSI y probarlo hacen falta los siguientes

2.3. Procesamiento de los archivos

49

Un editor de textos como

Linux

Bloc de notas

para crear las pginas

HTML.

de

Microsoft Windows

joe

de

Si se va a crear un programa externo que se va a ejecutar mediante las directivas

Pascal, etc.) o intrprete (Perl, shell de Unix, etc.).


o

SSI,

hace falta el correspondiente compilador (

C , C++,
SSI.

Un servidor web (ya sea local o remoto) que acepte las directivas Por ejemplo,

Server

Microsoft Personal Web Server, Microsoft Internet Information Apache. Netscape Communicator
o para poder comprobar las pginas

Por ltimo, un navegador como

ternet Explorer

miento de las directivas

SSI.

HTML y el funciona-

Microsoft In-

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.

syntax highlight . Esta

2.3.

Procesamiento de los archivos

Normalmente, el procesamiento de archivos archivos que contienen

SSI se encuentra desactivado,

ya que si no se tiene cuidado, puede suponer un agujero de seguridad. Los

SSI hay que tratarlos como si fueran programas CGI:

al igual que estos, es conveniente que se encuentren almacenados en un nico directorio, que sea el nico que posea permisos de ejecucin.

HTML que contienen directivas SSI. No es conveniente activar el intrSSI para todas las pginas, ya que entonces todas las pginas se van a interpretar (incluidas las que no contienen SSI) y el tiempo de respuesta del
nas prete servidor web aumentar. Las extensiones predeterminadas normalmente son

Adems, es conveniente emplear una extensin especial para aquellas pgi-

.stm, .shtm
aadir otras.

.shtml,

aunque en la mayora de los servidores web se pueden

50

Captulo 2.

SSI

HTML. Cuando llega a una directiva SSI, inserta directamente en la pgina HTML el resultado que produce el comando, como por ejemplo el contenido de un archivo incluido. Si el archivo incluido contiene a su vez directivas SSI,
tambin se inserta dicho archivo. En es necesario que el directorio en el que residen posea permisos de de

El servidor web procesa las directivas

SSI

mientras procesa la pgina

Ejecucin o Archivos de comandos, tal como vemos en la Figura 2.1. Adems, tienen que estar vinculadas las extensiones de los archivos que contengan SSI con el
intrprete

Microsoft Personal Web Server, para que se interpreten los archivos SSI

ssinc.dll.

Figura 2.1: Permisos de ejecucin en Microsoft Personal Web Server

2.4.

Comentarios HTML y comandos SSI

Las directivas SSI se incluyen en una pgina HTML como comentarios de HTML. Esto facilita la portabilidad de las pginas: un servidor que no entienda SSI, enviar al cliente web (navegador) las pginas tal cual, sin interpretarlas; el cliente ignorar las directivas SSI, ya que se encuentran en comentarios. Por otra parte, el servidor web que s sepa interpretar SSI, interpretar los comandos y sustituir los comentarios por el resultado obtenido. Los comentarios en Por ejemplo:

HTML van encerrados entre los smbolos <!-- y -->.


Ejemplo 2.1

2.5. Comandos SSI ms comunes

51

<!-- Formulario de entrada: nombre y apellidos -->

Cuando

SSI

est activo, el servidor web analiza los comentarios

y busca comandos

SSI. El servidor web puede distinguir un comentario norSSI es:

HTML

mal de un comando porque los comandos tienen que empezar con el smbolo almohadilla (#). La sintaxis general de los comandos

<!-- #comando parametro="valor" -->

Ejemplo 2.2

donde hacer,

valor

comando es la palabra parametro indica el tipo

clave que indica lo que el servidor tiene que de parmetro que se le pasa al comando, y

es el valor asignado a dicho parmetro. Esta sintaxis es muy importan-

te seguirla escrupulosamente, ya que muchos servidores no son exibles: por ejemplo, si se deja un espacio en blanco entre normal de

y el nombre del comando, la

mayora de los servidores no ejecutarn nada (lo tomarn como un comentario

HTML).

2.5.

Comandos SSI ms comunes

Como se ha comentado previamente, no existe un estndar

SSI. Por tanto,

los nombres de los comandos y su funcionalidad puede variar de un servidor web a otro. A continuacin comentamos los comandos ms comunes que se encuentran en la mayora de los servidores:

fsize

include.

config, echo, exec, flastmod,

2.5.1. cong
Esta directiva especica el formato utilizado para presentar los mensajes de error, fechas y tamaos de archivo devueltos por otros comandos. La sintaxis de este comando es:

<!-- #config parametro="valor" -->

Ejemplo 2.3

52

Captulo 2.

SSI

donde

parametro

indica el resultado al que se le va a asignar formato. Los

posibles parmetros que acepta el comando

sizefmt.

config

son:

errmsg, timefmt

Cada uno de estos parmetros posee unos valores especcos que se

van a explicar a continuacin.

errmsg
Controla el mensaje devuelto al navegador del cliente cuando se produce un error durante el proceso de una directiva

SSI.

De forma predeterminada,

el mensaje de error proporciona informacin de depuracin que detalla exactamente el error. Para suprimir dichos detalles, se puede indicar un mensaje de error corto y sencillo. Por ejemplo, la siguiente pgina web contiene una etiqueta y el mensaje de error que produce el servidor web.

SSI

con un

error. En la Figura 2.2 se puede ver como se visualiza la pgina en un navegador

1 2 3 4 5 6 7

<HTML> <BODY> Esta pgina contiene una etiqueta SSI con un error <BR><BR> <!-- #config sizefmt="nada" --> </BODY> </HTML>
El siguiente cdigo es la misma pgina que la del ejemplo anterior, pero el

Ejemplo 2.4

mensaje de error se ha personalizado. En la Figura 2.3 se visualiza la pgina en un navegador; se puede observar como ha cambiado el mensaje de error.

1 2 3 4 5 6 7 8

<HTML> <BODY> Esta pgina contiene una etiqueta SSI con un error <BR><BR> <!-- #config ERRMSG="<I>Se ha producido un error :-)</I><BR>" --> <!-- #config sizefmt="nada" --> </BODY> </HTML>

Ejemplo 2.5

2.5. Comandos SSI ms comunes

53

Figura 2.2: Mensaje de error por defecto

Figura 2.3: Mensaje de error personalizado

54

Captulo 2.

SSI

timefmt
Especica el formato que se debe emplear para mostrar la fecha y la hora. El valor del parmetro especica el formato. Se pueden extraer partes individuales de la fecha, como el da de la semana o el mes. El formato que se emplea es el mismo que se usa con la funcin

strftime() de C y del sistema Unix. El formato de la fecha y la hora modica el formato de salida del comando #echo y #flastmod. Los modicadores de formato que se pueden
operativo emplear aparecen en el Cuadro 2.1. En el Cuadro 2.2 se muestran algunos ejemplos de uso de los distintos formatos de la fecha. Adems, en la Figura 2.4 se puede ver como se muestra la hora con el formato

%H:%M:%S %p.

sizefmt
Presenta el tamao del archivo en kilobytes o en bytes. Modica el formato de salida del comando

#fsize.

Los modicadores de formato que se pueden

emplear aparecen en el Cuadro 2.3.

2.5.2. echo
Esta directiva indica al servidor web que inserte el valor de una variable de entorno en una pgina

HTML. La sintaxis de este comando es:


Ejemplo 2.6

<!-- #echo var="NombreVariable" -->


donde

NombreVariable indica el nombre de una variable de entorno normal (PATH, TEMP), una variable de entorno CGI (QUERY_STRING, REQUEST_METHOD) o una variable de entorno SSI (DATE_GMT, DATE_LOCAL, DOCUMENT_NAME, LAST_MODIFIED, QUERY_STRING_UNESCAPED).
Por ejemplo, el resultado de la siguiente pgina se puede ver en la Figura 2.4 como se muestra en un navegador:

1 2 3 4

<HTML> <BODY> <BR>DATE_LOCAL: <!-- #config timefmt="%H:%M:%S %p" -->

Ejemplo 2.7

2.5. Comandos SSI ms comunes

55

%a %A %b %B %c %d %H %I %j %m %M %p %S %U %w %W %x %X %y %Y

Modicador

Descripcin
Nombre abreviado del da de la semana (por ejemplo,

Lun).
Nombre completo del da de la semana (por ejemplo,

Lunes).
Nombre abreviado del mes (por ejemplo, Nombre completo del mes (por ejemplo, racin regional (por ejemplo,

Feb). Febrero).

Representacin de la fecha y la hora segn la congu-

05/06/91 12:51:32). Da del mes como nmero decimal (01-31) Hora en formato de 24 horas (00-23). Hora en formato de 12 horas (01-12). Da del ao como nmero decimal (001-366). Mes como nmero decimal (01-12). Minutos como nmero decimal (00-59).
Indicador de A.M. o P.M. segn la conguracin regional actual para el formato de 12 horas (por ejemplo, Segundos como nmero decimal (00-59). Semana del ao como nmero decimal, siendo el domingo el primer da de la semana (00-51). Da de la semana como nmero decimal, siendo el domingo el primer da (0-6). Semana del ao como nmero decimal, siendo el lunes el primer da de la semana (00-51). Representacin de la fecha segn la conguracin regional actual (por ejemplo, nal actual (por ejemplo,

p.m.).

05/06/91). 69).

Representacin de la hora segn la conguracin regio-

12:51:32).

Ao sin siglo como nmero decimal (por ejemplo,

Ao con siglo como nmero decimal (por ejemplo,

%z, %Z %%

1969).
Nombre o abreviatura de la zona horaria; en blanco si la zona horaria es desconocida. Signo de porcentaje.

Cuadro 2.1: Modicadores de timefmt

56

Captulo 2.

SSI

%d-%m-%y %H:%M:%S %p %a %d %b %y

Formato

Descripcin
Muestra el da, el mes y el ao. Por ejemplo: cador de 12 horas. Por ejemplo: del mes. Por ejemplo:

21-08-01

Muestra las horas, los minutos y segundos con el indi-

17:03:00 PM

Muestra la fecha con el da de la semana y el nombre

Tue 21 Aug 01

Cuadro 2.2: Ejemplos de distinto formato fecha

ABBREV BYTES

Modiador

Descripcin
Presenta los tamaos de los archivos en kilobytes. Presenta los tamaos de los archivos en bytes.

Cuadro 2.3: Modicadores de sizefmt

5 6 7 8 9

<!-- #echo var="DATE_LOCAL" --> <BR>Esta pgina es <!-- #echo var="DOCUMENT_NAME" --> <BR>Tu direccin IP es <!-- #echo var="REMOTE_ADDR" --> </BODY> </HTML>
Otros ejemplos del comando

#echo

(en cursiva aparece el comando

SSI y

a continuacin el resultado que produce):

La fecha y hora de hoy es <!-- #echo var="DATE_LOCAL" --> La fecha y hora de hoy es Thursday, 23-Aug-2001 12:57:24 EDT Has llegado aqu desde la pgina <!-- #echo var="HTTP_REFERER" --> Has llegado aqu desde la pgina http://www.ua.es/index.html La hora en el meridiano de Greenwich es <!-- #echo var="DATE_GMT" --> La hora en el meridiano de Greenwich es Thursday, 23-Aug-2001 16:57:24 GMT

2.5. Comandos SSI ms comunes

57

Figura 2.4: Ejemplo de comando echo

Tu IP es <!-- #echo var="REMOTE_ADDR" --> Tu IP es 193.145.234.59 El nombre de esta pgina es <!-- #echo var="DOCUMENT_NAME" --> El nombre de esta pgina es ssi-prueba.shtml Tu navegador y sistema operativo es <!-- #echo var="HTTP_USER_AGENT" --> Tu navegador y sistema operativo es Mozilla/4.78 [en] (Windows NT 5.0; U)

Volver fcilmente con SSI. Como se ha visto en los ejemplos anteriores, existe la variable de entorno CGI
Tambin podemos crear un enlace o botn de

HTTP_REFERER

que indica la pgina anterior en la navegacin. El siguiente

cdigo crea un enlace que permite volver atrs (si se sustituye el texto por una imagen, se obtiene un botn):

Volver

<A HREF="<!-- #echo var="HTTP_REFERER" -->">Volver</A>

Ejemplo 2.8

58

Captulo 2.

SSI

2.5.3. exec
Esta directiva permite ejecutar un programa o comando del sistema ope-

HTML
rectiva

rativo e incluir su resultado en una pgina

HTML. Permitir que los archivos


sigan utilizando las dems

ejecuten aplicaciones externas plantea ciertos riesgos de seguridad. y permitir que las pginas

Normalmente, en la mayora de los servidores web se puede desactivar la di-

#exec

directivas

SSI.

HTML

La sintaxis de esta directiva es:

<!-- #exec parametro="valor" -->


donde

Ejemplo 2.9

valor

parametro indica el tipo de comando o programa que se va a ejecutar cgi,


pero tambin existe

es la ruta (absoluta o relativa) al comando o programa que se desea

ejecutar. El tipo de comando suele ser

script,

cmd, exe
1

aunque no estn disponibles en todos los servidores. Por ejemplo, la

siguiente instruccin ejecuta un programa y le pasa dos parmetros :

<!-- #exec cgi="/scripts/guestbook.exe?Nombre+Apellidos" -->


En

Ejemplo 2.10

cgi

Microsoft Personal Web Server cmd:

4.0 se reconocen los tipos de comandos

cgi CGI2 , un pgina ASP o una aplicacin Internet Server Application Program Interface (ISAPI).
Ejecuta una aplicacin, como puede ser un programa El valor del parmetro es una cadena que contiene la ruta de acceso virtual pasados a la aplicacin. Los parmetros se separan por signos ms (+). de la aplicacin, seguida de un signo de interrogacin (?) y de los parmetros

1 2

Para pasar los parmetros, se emplea el mismo formato que con los programas

En la documentacin de Microsoft Personal Web Server gura que se puede ejecutar un

programa ejemplo,

HTML

Content-type: text/html)

CGI

. Se puede hacer, pero las cabeceras que produzca el programa

no se eliminan, por lo que se incluyen en la pgina

CGI CGI

(por

. Por tanto, realmente no es conveniente ejecutar programas

CGI

de esta forma.

2.5. Comandos SSI ms comunes

59

cmd
Ejecuta un comando del intrprete de comandos. El valor del parmetro es una cadena que contiene la ruta fsica completa del comando, seguida de los parmetros separados por espacios en blanco. Si no se especica la ruta completa, el servidor web busca en la ruta del sistema. Por ejemplo, el siguiente cdigo produce la pgina que se muestra en la Figura 2.5:

1 2 3 4 5 6 7

<HTML> <BODY> <PRE> <!-- #exec cmd="mem.exe" --> </PRE> </BODY> </HTML>

Ejemplo 2.11

2.5.4. astmod
Esta directiva indica al servidor web que inserte en una pgina La sintaxis de esta directiva es:

HTML el

instante (fecha y hora) en que se modic por ltima vez el archivo especicado.

<!-- #flastmod parametro="valor" -->

Ejemplo 2.12

donde

parametro

puede ser

file

virtual

valor

contiene la ruta al

archivo. En el Cuadro 2.4 se muestran los distintos parmetros del comando

flastmod.
De forma predeterminada, el instante de modicacin se expresa como una fecha con el formato plo,

NombreDa NombreMes NmeroDa NmeroAo (por ejemMartes Junio 3 1997). Se puede modicar el formato mediante la directiva #config con la opcin timefmt.

60

Captulo 2.

SSI

Figura 2.5: Ejemplo de comando exec

file

Parmetro

Descripcin
El valor del parmetro indica una ruta relativa al archivo desde el directorio que contiene el documento con esta directiva.

virtual

El valor del parmetro contiene una ruta virtual completa al archivo desde el directorio principal del sitio web.

Cuadro 2.4: Parmetros del comando astmod, fsize e include

2.5. Comandos SSI ms comunes

61

2.5.5. fsize
Esta directiva indica al servidor web que inserte en una pgina tamao del archivo especicado. La sintaxis de esta directiva es:

HTML el

<!-- #fsize parametro="valor" -->


donde

Ejemplo 2.13

parametro

puede ser

file

virtual

valor

contiene la ruta al

archivo. En el Cuadro 2.4 se muestran los distintos parmetros del comando

fsize.
De forma predeterminada, el tamao se expresa en kilobytes. Se puede modicar la unidad de medida mediante la directiva

sizefmt.

#config

con la opcin

2.5.6. include
Esta directiva indica al servidor web que inserte en una pgina nido vlido en los documentos

HTML

el contenido de un archivo. El archivo incluido puede tener cualquier conte-

HTML.

Los archivos incluidos pueden tener

cualquier extensin, pero se recomienda que tengan la extensin La sintaxis de esta directiva es:

.inc.

<!-- #include parametro="valor" -->


donde

Ejemplo 2.14

parametro puede ser file o virtual y valor indica la ruta de acceso include.

al archivo que se quiere incluir. En el Cuadro 2.4 se muestran los distintos parmetros del comando Evidentemente, el directorio donde se encuentre el archivo que se quiere incluir debe poseer permisos de lectura para que el servidor web lo pueda leer. Por ejemplo, suponed que tenemos un pie de pgina que lo queremos incluir en todas las pginas de nuestro sitio web:

1 2

Correo electrnico: <A HREF="mailto:slujan@dlsi.ua.es">slujan@dlsi.ua.es</A>

Ejemplo 2.15

62

Captulo 2.

SSI

La lnea anterior la almacenamos en un archivo, por ejemplo

pie.inc.

partir de entonces, en todas nuestras pginas podemos poner una directiva

#include

que inserte ese archivo. Por ejemplo, suponed que las siguientes ins-

trucciones pertenecen a la pgina principal del sitio web:

1 2 3 4 5 6 7 8 9 10

<HTML> <BODY> <H1>Bienvenido a la web de SLM</H1> Informacin: ... <BR> Enlaces: ... <BR> <!-- #include file="pie.inc" --> </BODY> </HTML>

Ejemplo 2.16

Cuando el cliente web (navegador) reciba la pgina, el servidor web habr procesado la directiva

SSI y lo que realmente recibir ser:


Ejemplo 2.17

1 2 3 4 5 6 7 8 9 10 11

<HTML> <BODY> <H1>Bienvenido a la web de SLM</H1> Informacin: ... <BR> Enlaces: ... <BR> Correo electrnico: <A HREF="mailto:slujan@dlsi.ua.es">slujan@dlsi.ua.es</A> </BODY> </HTML>

2.6.

Ejemplo de programa SSI

#exec y un programa ejecutable en C . El programa calcula cuantos das faltan


hasta el

El siguiente ejemplo se compone de una pgina

HTML con una directiva

Da de Navidad

(el cdigo se puede adaptar o hacer genrico para que

2.6. Ejemplo de programa SSI

63

calcule cuantos das faltan hasta una fecha dada). La pgina el programa mediante la directiva pgina. El cdigo de la pgina

HTML es:

#exec

HTML ejecuta

y muestra el resultado en la propia

1 2 3 4 5

<HTML> <BODY> <!-- #exec cgi="/scripts/ssi-navidad.exe" --> </BODY> </HTML>


El cdigo del programa ejecutable en

Ejemplo 2.18

C es:

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

#include <stdio.h> #include <time.h>

Ejemplo 2.19

void main(int argc, char *argv[]) { struct tm hoy; time_t ahora; int dias; /* Obtiene la fecha actual como UCT */ time(&ahora); /* Convierte la fecha actual a la hora local */ hoy = *localtime(&ahora); mktime(&hoy); /* Los meses comienzan desde 0, pero los dias y aos desde 1 */ if((hoy.tm_mon == 11) && (hoy.tm_mday == 24)) printf("Hoy es Nochebuena, y maana Navidad"); else if((hoy.tm_mon == 11) && (hoy.tm_mday == 25)) printf("Hoy es Navidad!"); else { /* Calcula cuantos dias faltan hasta Navidad */ dias = 0; while((hoy.tm_mon != 11) || (hoy.tm_mday != 25)) {

64

Captulo 2.

SSI

28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54

} printf("Faltan <B>%d</B> dias hasta Navidad", dias); printf("<BR>\n"); if(dias < 30) { printf("Menos de un mes! "); printf("Navidad est ah."); } else if(dias < 60) { printf("Menos de dos meses. "); printf("Hay que comprar los regalos."); } else { printf("An falta un poco. "); printf("Pero hay que empezar a prepararse."); }

dias++; hoy.tm_mday = hoy.tm_mday + 1; mktime(&hoy);

/* Vacia la salida estandar */ fflush(stdout); return;

En la Figura 2.6 vemos como se visualiza la pgina en un navegador. En el cdigo se puede ver que la hora se obtiene mediante la funcin convierte a la hora local por medio de la funcin obtiene es la del servidor web, no la del cliente.

localtime(). La hora que se

time()

y se

2.6. Ejemplo de programa SSI

65

Figura 2.6: Ejemplo de programa ejecutado mediante exec

Captulo 3

IDC
IDC es una tecnologa desarrollada por Microsoft que permite integrar el contenido de una base de datos dentro de una pgina web. Gracias a esta tecnologa, se pueden crear pginas web dinmicas. Una aplicacin IDC consta de dos pginas: una contiene la informacin necesaria para realizar la consulta a la base de datos (qu informacin se tiene que recuperar), mientras que la otra es una plantilla que indica como se tiene que formatear el resultado devuelto por la base de datos (cmo se tiene que presentar la informacin). Con IDC, se puede ejecutar cualquier comando SQL (actualizacin, insercin, borrado, etc.) en una base de datos.

ndice General
3.1. 3.2. 3.3. 3.4. 3.5. Introduccin . . . . . . . . . . . . . . . . . . . . . . . 68 68 69 72 74 Cmo funciona . . . . . . . . . . . . . . . . . . . . . . Qu necesito para programar mediante IDC Un IDC sencillo El archivo .idc . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.5.1. Campos obligatorios . . . . . . . . . . . . . . . . . . 74 3.5.2. Campos opcionales . . . . . . . . . . . . . . . . . . . 75 3.5.3. Campos opcionales avanzados de ODBC . . . . . . . 77
3.6. El archivo .htx . . . . . . . . . . . . . . . . . . . . . . 77

3.6.1. Valor de un campo en un formulario . . . . . . . . . 78 3.6.2. Variables integradas . . . . . . . . . . . . . . . . . . 79


67

68

Captulo 3. IDC

3.7. 3.8.

Cmo procesar los campos de un formulario Un IDC ms complejo

. . . .

79 80

. . . . . . . . . . . . . . . . .

3.8.1. Ejemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . 80 3.8.2. Ejemplo 2 . . . . . . . . . . . . . . . . . . . . . . . . 81 3.8.3. Ejemplo 3 . . . . . . . . . . . . . . . . . . . . . . . . 84

3.1.

Introduccin

Internet Database Connector (IDC) es una tecnologa desarrollada por Microsoft para su servidor web

Microsoft Internet Information Server.

Mediante

esta tecnologa, se pueden crear pginas web dinmicas: permite extraer informacin de una base de datos y devolverla en forma de pgina web a travs de Internet. Bsicamente,

IDC permite:

Consultar una base de datos y mostrar el resultado en una pgina web. Actualizar o insertar datos nuevos en una base de datos a partir de los datos introducidos por el usuario en un formulario. Eliminar registros en una base de datos segn el usuario haya seleccionado en una pgina web. La conexin con la base de datos se realiza mediante

nectivity (ODBC) de 32 bits. Por tanto, se puede emplear como base de datos cualquier sistema que disponga de su correspondiente controlador ODBC. IDC se ha visto superada por otras tecnologas, como ASP de la propia Microsoft o JSP de Sun Microsystems. Pero an quedan sitios web que
ms avanzadas.

Open Database Con-

emplean esta tecnologa, es muy interesante saber cmo se programaba en los primeros aos de la web y su sencillez facilita el posterior estudio de tecnologas

3.2.

Cmo funciona

IDC:

En la Figura 3.1 est representado el funcionamiento bsico de un programa

3.3. Qu necesito para programar mediante IDC

69

1.

El cliente web (el navegador) lanza una peticin nueva

.idc

mediante

HTTP.

1 de un archivo

Est peticin puede ir acompaada de datos

codicados por el navegador (por ejemplo, informacin introducida por el usuario en un formulario). 2.

URL y detecta que se trata 2 de un archivo .idc. Le pasa la peticin a IDC .


El servidor web recibe la peticin, analiza la

3.

IDC recibe la peticin. Lee el archivo .idc indicado en la URL. Estos


archivos contienen la informacin necesaria para conectar con el origen de datos

ODBC apropiado y ejecutar la instruccin Structured Query Language (SQL). Los archivos .idc tambin contienen el nombre y la ubicacin del archivo de extensin de HTML correspondiente (.htx).
.htx.

4. 5.

Realiza la peticin a la base de datos y obtiene los datos de la operacin. Lee el archivo Este archivo es la plantilla del documento

real que se va a devolver al cliente despus de que en ella la informacin de la base de datos. 6. El programa al servidor. 7.

HTML IDC haya combinado HTML,


y lo enva

IDC

genera su resultado, una pgina

El servidor web procesa la informacin recibida del cdigo necesario para formar un encabezado

IDC: le HTTP correcto.

aade el

8. 9.

El servidor web reenva el resultado del

IDC al cliente web.

El cliente web muestra la pgina generada de forma dinmica.

3.3.

Qu necesito para programar mediante IDC

Para poder programar mediante programas:

IDC y probarlo hacen falta los siguientes

1 2

Una peticin nueva porque el usuario ha pulsado sobre un enlace o porque ha escrito

una direccin nueva (

Httpodbc.dll.

IDC

es una Dynamic Link Library (

URL

).

DLL ISAPI
)

, que se encuentra en el chero

70

Captulo 3. IDC

Figura 3.1: Esquema bsico de una aplicacin web basada en IDC

Un editor de textos como

Linux

Bloc de notas

para crear las pginas

HTML y los
o

de

Microsoft Windows o joe cheros .idc y .htx.

de

Un servidor web (ya sea local o remoto) que acepte

Microsoft Personal Web Server

Microsoft Internet Information Server.


3

IDC. Por ejemplo,


Informix)

Si se desea acceder a una base de datos , el sistema gestor de bases de datos apropiado (por ejemplo, controlador (

driver ) ODBC correspondiente4 .

Microsoft SQL Server

y el

Por ltimo, un navegador como

ternet Explorer
miento de

Netscape Communicator

Microsoft In-

IDC.

para poder comprobar las pginas HTML y el funciona-

No es necesario disponer de una conexin a Internet, ya que se puede comprobar localmente el cdigo creado. Para utilizar 1.

IDC se tienen que seguir los siguiente pasos: ODBC necesario para acceder a la base de datos.

Instalar el controlador

3 4

Se puede emplear cualquier base de datos que sea accesible mediante

Aunque Microsoft Access no se puede considerar un gestor de bases de datos, como

ODBC

dispone de driver

ODBC

tambin se puede emplear.

3.3. Qu necesito para programar mediante IDC

71

2.

Crear un de datos.

Data Source Name (DSN)


.idc

de sistema para acceder a la base

3.

Crear el archivo

con instrucciones de consulta

datos (se hace referencia al

DSN creado). Adems, este chero tambin


.htx

SQL

a la base de

contiene el nombre del archivo

que se va a emplear como plantilla.

4.

Crear el archivo

.htx

con las etiquetas

HTML

que dan formato a los

datos devueltos por la base de datos.

Para poder ejecutar los cheros ejecutar un

.idc,

el directorio donde se encuentran

alojados debe de poseer permisos de ejecucin. En caso contrario, al intentar

IDC se muestra el mensaje de error que se ve en la Figura 3.2.

Figura 3.2: Mensaje de error porque no hay permisos de ejecucin

Si se emplea

Microsoft Personal Web Server, el directorio que almacena estos

dos, tal como se pude apreciar en la Figura 3.3.

cheros tiene que poseer los permisos de

Ejecucin o Archivos de coman-

72

Captulo 3. IDC

Figura 3.3: Permisos de ejecucin en Microsoft Personal Web Server

3.4.

Un IDC sencillo

Veamos con un ejemplo sencillo como funciona nemos creada una base de datos (por ejemplo, en creado un

Articulos con dos campos: Codigo archivo .idc (prueba1.idc) es:


1 2 3

DSN llamado prueba. La base de datos contiene una tabla llamada


y

Microsoft Access)

IDC.

Suponemos que tey hemos

Descripcion.

El cdigo mnimo para el

Datasource: prueba1 Template: prueba1.htx SQLStatement: SELECT * FROM Articulos


donde

Ejemplo 3.1

Datasource

tensin de ejecutar.

HTML

indica el

asociado y

DSN, Template el nombre del archivo de exSQLStatement la sentencia SQL que se desea
puede ser el siguiente:

El cdigo del archivo

prueba1.htx

1 2 3 4 5

<HTML> <BODY> <HR> <%begindetail%> Codigo: <B><%Codigo%></B><BR>

Ejemplo 3.2

3.4. Un IDC sencillo

73

6 7 8 9 10

Descripcion: <I><%Descripcion%></I><BR> <HR> <%enddetail%> </BODY> </HTML>

Como se ve, el archivo

.htx

es una pgina

HTML

normal con alguLas secciones

nas etiquetas especiales que van encerradas entre

< %begindetail %> < %Descripcion %>

< %enddetail %>

< % ... %>.

delimitan la zona del documento en la

que aparecern las las devueltas por la base de datos. Las columnas devueltas por la consulta estn enmarcadas por en este ejemplo.

< % ... %>,

como

< %Codigo %>

En la Figura 3.4 se puede ver como se muestra la pgina en el navegador

Microsoft Internet Explorer.

Figura 3.4: Ejemplo de un IDC sencillo

74

Captulo 3. IDC

3.5.

El archivo .idc

Los archivos

.idc contienen la informacin necesaria para conectarse a una .htx.

base de datos y ejecutar una sentencia referencia al archivo

SQL. Adems, tambin contienen una


.idc

Los campos que se emplean en un archivo pos opcionales avanzados de

se clasican en tres gru-

pos: campos obligatorios (siempre tienen que estar), campos opcionales y cam-

ODBC).

ODBC (especican opciones para el controlador

3.5.1. Campos obligatorios


Los campos obligatorios siempre tienen que aparecer en un archivo es lo mnimo para que funcione. Estos campos son:

SQLStatement.

.idc: Datasource, Template y

Datasource
Nombre del origen de datos ( produce

DSN del sistema) que se emplea para conectar

con la base de datos. En la Figura 3.5 se muestra el mensaje de error que

IDC cuando no se encuentra el DSN indicado.

Figura 3.5: Mensaje de error porque no existe DNS

3.5. El archivo .idc

75

Template
Nombre del archivo de extensin de devueltos por la consulta.

HTML

que da formato a los datos

SQLStatement
Instruccin tinuacin de este campo, las lneas que comiencen con un signo ms (+) se consideran parte del campo.

SQL que se desea ejecutar. Puede ocupar varias lneas: a con-

3.5.2. Campos opcionales


Content-Type
Tipo

MIME

vlido que describe lo que se va a devolver al cliente. Casi si el archivo

siempre ser

text/html

.htx

contiene

HTML.

DefaultParameters
Asigna valor a aquellos parmetros que el usuario no haya asignado valor. Por ejemplo:

DefaultParameters=ciudad=Alicante,provincia=Alicante

Ejemplo 3.3

Expires
Nmero de segundos que hay que esperar antes de actualizar una pgina almacenada en memoria cach. De forma predeterminada,

IDC no almacena

en memoria cach las pginas; slo las almacena cuando se utiliza este campo.

MaxFieldSize
Tamao mximo asignado a cada campo devuelto por una base de datos. El resto de caracteres se trunca. El valor predeterminado es 8192 bytes.

76

Captulo 3. IDC

MaxRecords
Nmero mximo de registros que se devuelven desde cualquier consulta. Este campo no tiene un valor predeterminado, lo que signica que una consulta puede devolver hasta 4000 millones de registros.

ODBCConnection
Permite indicar si se desea agregar la conexin al conjunto de conexiones que se mantienen abiertas para futuras consultas (Pool) o no (NoPool). Esta opcin permite mejorar el rendimiento en el acceso a las bases de datos, pero el nmero de conexiones simultneas puede tener un lmite.

Password
Contrasea necesaria para el nombre de usuario empleado para conectarse a la base de datos. Se emplea junto con el campo

Username.

RequiredParameters
Nombres de los parmetros, si hay alguno, que de los parmetros estn separados por comas.

Httpodbc.dll

comprueba

que se reciben del cliente; de lo contrario, se devuelve un error. Los nombres

Translationle
Ruta del archivo que asigna caracteres no ingleses (como to

, ,

de forma que los navegadores puedan presentarlos correctamente en forma-

HTML. Si el archivo de traduccin no est en el mismo directorio que el


.idc,

archivo

se debe escribir la ruta completa al archivo de traduccin. Por

ejemplo:

Translationfile: C:\Ficheros\traduccion.txt
El archivo de traduccin es un archivo de texto que asigna a cada carc-

Ejemplo 3.4

ter especial una traduccin mediante el formato siguiente:

HTML.

donde

valor

es un carcter especial y

cadena

valor=cadena<CR>,

es el correspondiente cdigo

3.6. El archivo .htx

77

Username
Nombre de usuario empleado para conectarse a la base de datos. Se emplea junto con el campo

Password.

3.5.3. Campos opcionales avanzados de ODBC


Las opciones avanzadas de lador

ODBC permiten depurar y ajustar el controODBC. El formato que se emplea en el archivo IDC es el siguiente:
Ejemplo 3.5

ODBCOptions: Opcion=Valor[,Opcion=Valor...]

No vamos a comentar cada opcin, pero incluimos la lista de opciones disponibles: SQL_ACCESS_MODE, SQL_LOGIN_TIMEOUT, SQL_OPT_TRACE, SQL_OPT_TRACEFILE, SQL_PACKET_SIZE, SQL_TRANSLATE_DLL, SQL_TRANSLATE_OPTION, SQL_TXN_ISOLATION, SQL_MAX_LENGTH, SQL_MAX_ROWS, SQL_NOSCAN y SQL_QUERY_TIMEOUT.

3.6.

El archivo .htx

Los archivos

.htx (HTML Extension Template )

son unas plantillas que

se emplean para formatear los resultados de una consulta. En realidad, la extensin de estos archivos puede ser cualquiera (no es obligatorio que sea

.htx).
Estos archivos contienen una serie de palabras clave que controlan cmo se genera el documento

< %if %>, < %else %>


Las seccin

< %endif %>. palabras clave < %begindetail %> y < %enddetail %> enmarcan una del archivo .htx en la que se van a combinar datos procedentes de
y

HTML de resultado: < %begindetail %>, < %enddetail %>,

una base de datos. Para marcar la posicin de los datos devueltos por la base de datos, los nombres de las columnas van encerrados entre consulta no devuelve registros, se saltar la seccin

Los archivos .htx pueden contener lgica condicional con una instruccin < %if ... then ... else ... %> para controlar cmo se genera la pgina. La sintaxis de esta instruccin es:

< % ... %>. < %begindetail %>.

Si la

78

Captulo 3. IDC

1 2 3 4 5

<%if condicin %> texto HTML [<%else%> texto HTML] <%endif%>


donde la parte

Ejemplo 3.6

mato:

< %else %> es opcional. La condicin tiene el siguiente forvalor1 operador valor2. Los operadores contemplados se muestran en

el Cuadro 3.1, y aunque aparecen en maysculas, tambin se pueden emplear en minsculas.

EQ LT GT

Operador

Descripcin
Cierto si

valor2
Cierto si

valor1

es

igual

valor2
Cierto si

valor1 valor1

es menor que es mayor que parte de

CONTAINS

valor2
Cierto si

cualquier contiene la

valor1 valor2

cadena

Cuadro 3.1: Operadores de las expresiones lgicas

Como se ve, los operadores disponibles son muy pocos, lo que diculta la programacin de expresiones complejas (hay que emplear muchas sentencias condicionales en cascada).

3.6.1. Valor de un campo en un formulario


Si se quiere mostrar el valor que se ha introducido o seleccionado en un cam-

< %idc.nombreCampo %>, nombreCampo es el nombre asignado al campo del formulario mediante 5 el atributo NAME . Es muy importante no dejar un espacio en blanco entre % e idc.
po de un formulario, se tiene que emplear la sintaxis donde

Por ejemplo,

<INPUT TYPE="TEXT" NAME="apellidos">.

3.7. Cmo procesar los campos de un formulario

79

3.6.2. Variables integradas


Existen dos variables integradas que se pueden emplear en las pginas

CurrentRecord

MaxRecords. CurrentRecord contiene el nmero de veces que se ha procesado la seccin < %begindetail %>. La primera vez que se pasa por la seccin < %begindetail %>, el valor es cero. Despus, el valor de CurrentRecord
y La variable integrada se incrementa por cada registro devuelto por la base de datos. La variable integrada del archivo

.htx:

.idc

MaxRecords contiene el

valor del campo

MaxRecords

asociado a la pgina.

Muy importante: tanto utilizar en instrucciones

MaxRecords como CurrentRecord < %if ... then ... else ... %>.

slo se pueden

3.7.

Cmo procesar los campos de un formulario

Se pueden realizar consultas a una base de datos en funcin de los datos de entrada del usuario en un formulario

HTML.

Para ello hay que emplear

los valores que se envan con una peticin desde un formulario. El navegador web enva los datos de un formulario en forma de parejas

parametro=valor, donde parametro es el nombre del control en el formulario y valor es la entrada del usuario en el control. Cuando se quiera emplear el
valor de un parmetro en una consulta, se tiene que encerrar el nombre del control (parmetro) entre signos de porcentaje ( %). Por ejemplo, si tenemos un formulario con un cuadro de texto llamado una base de datos puede ser:

nombre,

una posible consulta a

1 2

SQLStatement: SELECT * FROM Clientes WHERE +NombreCliente='%nombre%'

Ejemplo 3.7

La cadena %nombre % aparece encerrada entre comillas porque el campo NombreCliente de la base de datos es de tipo cadena (char). Si fuera de tipo numrico (por ejemplo, int), no tendra que aparecer entrecomillado. El carcter de porcentaje ( %) tambin es un carcter comodn en SQL. Los comodines se utilizan en las consultas signicado especial cuando se emplea porcentaje como comodn de

SQL para buscar elementos de una

tabla (bsquedas mediante un patrn). Como el signo de porcentaje tiene un

SQL, se tiene que escribir dos veces ( % %).

IDC, para insertar un nico carcter de

80

Captulo 3. IDC

3.8.

Un IDC ms complejo

A continuacin presentamos tres ejemplos de pginas web basadas en

IDC.

El primero realiza una consulta que depende del valor seleccionado por el usuario en un formulario. El segundo ejemplo inserta en una base de datos los datos introducidos por el usuario en un formulario

HTML. El ltimo ejemplo

muestra como se puede incorporar validacin de usuarios a una aplicacin web.

3.8.1. Ejemplo 1
El siguiente y ejemplo se compone de tres cheros:

prueba2.idc Poblacion

tenga una tabla llamada

prueba2.htx. Adems, hace falta una base de datos que conClientes con los campos Nombre, Direccion y prueba2.

prueba2.html,

(todos ellos de tipo texto o cadena), y crear un origen de datos

para la base de datos llamado

prueba2.html
Este chero crea una pgina consulta, se solicita la pgina desplegable con dos valores (Alicante y

Valencia). prueba2.idc.
Ejemplo 3.8

HTML con un formulario que posee una lista


Al pulsar el botn de

1 2 3 4 5 6 7 8 9 10 11 12

<HTML> <BODY> <FORM ACTION="prueba2.idc" METHOD="POST"> Seleccione una poblacin: <SELECT NAME="poblacion"> <OPTION VALUE="Alicante">Alicante</OPTION> <OPTION VALUE="Valencia">Valencia</OPTION> </SELECT> <INPUT TYPE="SUBMIT" VALUE="Consultar"> </FORM> </BODY> </HTML>

prueba2.idc
Contiene el origen de datos, el nombre del chero sulta

SQL correspondiente. El nombre del campo del formulario que se emplea

.htx

asociado y la con-

3.8. Un IDC ms complejo

81

para realizar la consulta va encerrado entre signos de porcentaje ( %).

1 2 3 4

Datasource: prueba2 Template: prueba2.htx SQLStatement: SELECT * FROM Clientes WHERE +Poblacion='%poblacion%'

Ejemplo 3.9

prueba2.htx
Contiene el cdigo

HTML necesario para dar formato a los datos que se


Ejemplo 3.10

recuperan de la base de datos.

1 2 3 4 5 6 7 8 9 10 11

<HTML> <BODY> <HR> <%begindetail%> Nombre: <B><%Nombre%></B><BR> Direccion: <I><%Direccion%></I><BR> Poblacion: <U><%Poblacion%></U><BR> <HR> <%enddetail%> </BODY> </HTML>

3.8.2. Ejemplo 2
ejemplo se compone de tres cheros: prueba3.html, prueba3.htx. Adems, hace falta una base de datos que contenga una tabla llamada Articulos con los campos Codigo de tipo texto, Cantidad de tipo numrico y Descripcin de tipo texto, y crear un origen de datos para la base de datos llamado prueba3. El siguiente y

prueba3.idc

prueba3.html
Este chero crea una pgina dros de texto:

Codigo, Cantidad y Descripcion. Al pulsar el botn Insertar,

HTML con un formulario que posee tres cua-

se envan los datos al servidor y se insertan en la base de datos.

82

Captulo 3. IDC

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

<HTML> <BODY> <CENTER> <FORM ACTION="prueba3.idc" METHOD="POST"> Datos del artculo: <BR> <TABLE BORDER="0"> <TR> <TD>Cdigo: </TD> <TD><INPUT TYPE="TEXT" NAME="codigo"></TD> </TR> <TR> <TD>Cantidad: </TD> <TD><INPUT TYPE="TEXT" NAME="cantidad"></TD> </TR> <TR> <TD>Descripcin: </TD> <TD><TEXTAREA NAME="descripcion" ROWS="5" COLS="40"></TEXTAREA></TD> </TR> </TABLE> <INPUT TYPE="SUBMIT" VALUE="Insertar"> </FORM> </CENTER> </BODY> </HTML>
En la Figura 3.6 se muestra como se visualiza el cdigo anterior en el

Ejemplo 3.11

navegador

Microsoft Internet Explorer.

prueba3.idc
Contiene el origen de datos, el nombre del chero truccin de insercin en la base de datos mediante de porcentaje ( %). Darse cuenta de que los campos

SQL. El nombre del campo

.htx

asociado y la ins-

del formulario que se emplea para realizar la consulta va encerrado entre signos

codigo

descripcion cantidad

van encerrados

entre comillas simples porque los campos correspondientes esperan cadenas de texto. Sin embargo, el campo correspondiente a es numrico, por lo que no hace falta que aparezca entre comillas simples.

3.8. Un IDC ms complejo

83

Figura 3.6: Formulario de toma de datos para insercin

1 2 3 4

Datasource: prueba3 Template: prueba3.htx SQLStatement: INSERT INTO Articulos(Codigo, Cantidad, Descripcion) +VALUES ('%codigo%', %cantidad%, '%descripcion%')

Ejemplo 3.12

prueba3.htx
Si la insercin ha sido realizada, se muestra la siguiente pgina.

1 2 3 4 5

<HTML> <BODY> Inserccin realizada </BODY> </HTML>

Ejemplo 3.13

84

Captulo 3. IDC

3.8.3. Ejemplo 3
El siguiente y ejemplo se compone de tres cheros:

prueba4.idc prueba4.

tenga una tabla llamada

prueba4.htx. Adems, hace falta una base de datos que conUsuarios con los campos Nombre y Contrasea (todos

prueba4.html,

ellos de tipo texto), y crear un origen de datos para la base de datos llamado Este ejemplo muestra como se puede controlar el acceso a una parte privada de una web mediante la solicitud de un nombre de usuario y una contrasea.

prueba4.html
Este chero crea una pgina texto que solicitan un

Nombre

HTML con un formulario con dos campos de


Contrasea.
Al pulsar el botn

y una

Entrar,

se envan los datos al servidor y se comprueba la existencia de un nombre de usuario con la contrasea indicada. En la Figura 3.7 se puede ver como se muestra el siguiente cdigo en un navegador.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

<HTML> <BODY> <CENTER> <FORM ACTION="prueba4.idc" METHOD="POST"> Acceso a la parte privada: <BR><BR> <TABLE BORDER="0"> <TR> <TD>Usuario: </TD> <TD><INPUT TYPE="TEXT" NAME="nombre"></TD> </TR> <TR> <TD>Clave: </TD> <TD><INPUT TYPE="PASSWORD" NAME="contra"></TD> </TR> <TR> <TD>&nbsp;</TD> <TD ALIGN="CENTER"> <INPUT TYPE="SUBMIT" VALUE="Entrar"> <INPUT TYPE="RESET" VALUE="Borrar"> </TD> </TR>

Ejemplo 3.14

3.8. Un IDC ms complejo

85

23 24 25 26 27

</TABLE> </FORM> </CENTER> </BODY> </HTML>

Figura 3.7: Formulario de acceso a la parte privada

prueba4.idc
Contiene el origen de datos, el nombre del chero truccin de consulta en la base de datos mediante de porcentaje ( %). La sentencia

SQL. El nombre del campo

.htx

asociado y la ins-

del formulario que se emplea para realizar la consulta va encerrado entre signos

SQL

busca en la base de datos una tupla (registro) con el

nombre de usuario y la contrasea introducidos en el formulario.

86

Captulo 3. IDC

1 2 3 4

Datasource: prueba4 Template: prueba4.htx SQLStatement: SELECT * FROM Usuarios +WHERE Nombre = '%nombre%' AND Contrasea = '%contra%'

Ejemplo 3.15

prueba4.htx
Esta pgina muestra un mensaje de error si el nombre de usuario o la contrasea no son correctos, o el men principal de la parte privada si la validacin ha sido correcta. Para comprobar si la validacin ha sido correcta, consulta el valor de la variable

CurrentRecord:
Ejemplo 3.16

si vale 0, la sentencia

SQL no

ha devuelto ninguna tupla, lo que implica que el usuario no existe.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

<HTML> <BODY> <CENTER> <%begindetail%> <%enddetail%> <%if CurrentRecord EQ 0%> <FONT SIZE="4" COLOR="red">Acceso no permitido</FONT> <%else%> <FONT SIZE="4" COLOR="blue">Acceso permitido</FONT> <BR> Men principal de la aplicacin... <%endif%> </CENTER> </BODY> </HTML>

Apndice A

Cmo crear un DSN


En este apndice se explica en qu consiste ODBC y cmo se puede crear un origen de datos (DSN) en un sistema operativo Microsoft Windows 98 para acceder a una base de datos a travs de ODBC.

ndice General
A.1. ODBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 91 A.2. Creacin de un DSN

A.1.
Cada

ODBC

SGBD

posee su propio

Application Program Interface (API):


1

su

propio conjunto de funciones, su propia secuencia de llamadas necesarias para realizar una operacin y su propia forma de devolver la informacin . De cara al programador, esta situacin origina graves inconvenientes: Si queremos que una aplicacin acceda simultneamente a varias bases de datos alojadas en distintos distintos

El estndar

informacin en una base de datos, pero no especica los pasos necesarios para conectarse a una base de datos, enviar o recuperar los datos, etc.

SQL

API de cada sistema.

SGBD, necesitaremos conocer y usar los

dene las sentencias que se pueden emplear para almacenar o recuperar

87

88

Apndice A. Cmo crear un DSN

Si tenemos una aplicacin que accede a una base de datos en un

SGBD y

queremos almacenar la base de datos en otro sistema totalmente distinto, tendremos que reprogramar la aplicacin para que haga uso del nuevo

API.

Para evitar estos y otros problemas, se han denido distintas capas de abstraccin que evitan estos problemas, ya que la aplicacin no tiene que tratar directamente con el

SGBD. Una de las ms conocidas y empleadas es ODBC. ODBC ofrece una capa intermedia (middleware ) entre las aplicaciones y las
bases de datos, lo que se traduce en una mayor exibilidad a la hora de sustituir un

SGBD por otro.

En la Figura A.1 se han resumido los tres mecanismos de acceso a una base de datos ms comunes: mediante una solucin a media ( protocolo de comunicacin facilitado por el fabricante propietaria) o mediante

ODBC.

ad-hoc ), mediante un del SGBD (solucin

En el primer mtodo, mediante una solucin a medida, el programador tiene que crear el protocolo de comunicacin que permita conectar su aplicacin cliente con el servidor que aloja la base de datos. Para enviar y recibir los mensajes, se puede hacer uso de un protocolo de transporte ya existente, como

Transmission Control Protocol/Internet Protocol (TCP/IP)

o NetBEUI. El

programador tiene que establecer la forma de mantener un dilogo y tiene que denir cada uno de los posibles mensajes que pueden emplearse. Este mtodo suele ser el ms rpido y el que menos recursos necesita, pero es el ms laborioso y muy propenso a cometer errores. En el segundo mtodo, mediante un protocolo de comunicacin facilitado por el fabricante, el programador hace uso de un el fabricante del

SGBD

API especco que le facilita

por medio de una capa especca que se establece

entre la aplicacin y la base de datos. Esta capa intermedia se encarga de toda

ODBC, el programador hace uso de un API estndar que le facilita ODBC, y es este ltimo el que se encarga de traducir las llamadas al API estndar en llamadas al API especco de cada SGBD. Desde un punto de vista conceptual, ODBC es similar al sistema de impresin en
Por ltimo, mediante los sistemas operativos

la comunicacin entre el cliente y el servidor.

Microsoft Windows2 .

Para imprimir, una aplicacin emplea un

un controlador (driver ) especco para cada impresora traduce las rdenes enviadas a la impresora genrica en rdenes especcas para la impresora destino.

API

de una impresora genrica (virtual), y

A.1. ODBC

89

Figura A.1: Mecanismos de acceso a bases de datos

90

Apndice A. Cmo crear un DSN

En la Figura A.2 se ha esquematizado la arquitectura de de controladores

ODBC

ODBC: un gestor

gestiona todos los controladores instalados en un

sistema; para que una aplicacin pueda acceder a una base de datos, hace falta disponer del controlador apropiado; cada controlador para un especco de cada sistema.

ODBC especco SGBD transforma las llamadas al API ODBC en llamadas al API

Figura A.2: Arquitectura de ODBC

ODBC se puede considerar el interfaz de programacin estndar de facto


para acceder a bases de datos en los sistemas operativos de Microsoft, aunque tambin se encuentra disponible en otros sistemas operativos ( algunos

Unix,

IBM OS/2,

etc.).

A.2. Creacin de un DSN

91

Microsoft cre

sin, la 3.0 , apareci en 1996, y cumple prcticamente la especicacin de ANSI/ISO SQL-92 CLI, el estndar

ODBC

en 1992 a partir de SAG CLI . La ltima ver-

ODBC dene un API con cientos de funciones y constantes. Las funciones


Manipulacin de datos: etc. Informacin sobre la base de datos (metadatos) :

de jure

(ocial).

se pueden clasicar en distintas categoras:

SQLExecute, SQLFetch, SQLGetData, SQLRowCount,


5

SQLProcedures, SQLPrimaryKeys,
Informacin sobre el controlador:

SQLTables, SQLColumns,

etc.

TypeInfo,
un

SQLGetFunctions, SQLGetInfo, SQLGet-

etc.

API existentes, por lo que muchas funciones que existen en los API de algunos SGBD no se encuentran disponibles en ODBC. ODBC dene distintos niveles de conformidad con el estndar. Por un lado, existen una serie de niveles respecto a las sentencias SQL (gramtica SQL) aceptadas: mnimo (minimum ), ncleo (core ) y extendido (extended ). Por otro lado, existen distintos niveles respecto al API proporcionado: niveles
rar el mnimo comn denominador de todos los 0, 1 y 2. Ambos niveles son independientes, por lo que un controlador puede presentar cualquier combinacin posible. El uso de fabricantes de

API

La principal ventaja de

ODBC es a su vez su peor inconveniente: al ofrecer

estndar, se compone de aquellas funciones que se podran conside-

ODBC se encuentra muy extendido, de modo que los propios SGBD ofrecen controladores ODBC para sus propios sistemas

y terceras compaas tambin venden controladores para la mayora de las bases de datos.

A.2.

Creacin de un DSN

Mediante

ODBC,

una aplicacin puede acceder a distintas bases de da-

tos, controladas por distintos

SGBD, sin tener que modicar el cdigo de la

3 4 5

SQL Access Group Call-level Interface. La ltima revisin a principios de 2001 es la 3.5. Informacin sobre los nombres de las tablas, de las columnas, privilegios, etc.

92

Apndice A. Cmo crear un DSN

aplicacin para cada sistema. aplicacin y un pendencia) adicional. datos almacenada en un (

SGBD, de forma que se logra un nivel de abstraccin (indeODBC pueda emplear una base de SGBD nuevo, slo hace falta disponer del controlador DSN. Un DSN contiene toda la informacin
Microsoft Windows
de

ODBC

aade una capa intermedia entre una

Para que una aplicacin compatible con

driver ) apropiado.
En entornos

Microsoft Windows es posible lograr un nivel de independencia


6

adicional, gracias al empleo de

necesaria para conectarse a un origen de datos: ubicacin, sistema de la base de datos, usuario, contrasea, etc. En

Fuentes de datos ODBC (32 bits) DSN. Esta aplicacin es accesible a travs Panel de control.

7 (Figura A.3), que permite crear un

98 , existe la aplicacin

Inicio

Conguracin

Figura A.3: Fuentes de datos ODBC En la Figura A.4 se muestra la pantalla principal de la aplicacin

ministrador de orgenes de datos ODBC. Como se puede observar, se pueden crear tres tipos de DSN: DSN de usuario, de sistema y de archivo. Cuando se emplea DSN de usuario, los orgenes de datos son locales para
un equipo y slo pueden ser utilizados por el usuario actual. Por otro lado, los

Ad-

DSN de sistema son orgenes de datos locales para un DSN

equipo, ms que dedicados a un usuario. El sistema, o cualquier usuario que tenga privilegios, puede utilizar un origen de datos congurado con un de sistema. Por ltimo, los

DSN de archivo son orgenes de datos basados en archivos

que pueden ser compartidos entre todos los usuarios que tengan instalados los

6 7

La explicacin se reere a Microsoft Windows 98, pero se puede aplicar a la mayora de Las fuentes de datos tambin se conocen como orgenes de datos.

los sistemas operativos de

Microsoft

A.2. Creacin de un DSN

93

Figura A.4: Pantalla principal de Fuentes de datos ODBC

94

Apndice A. Cmo crear un DSN

mismos controladores y, por tanto, tengan acceso a la base de datos. Estos orgenes de datos no necesitan estar dedicados a un usuario ni ser locales en un equipo. Dependiendo del controlador seleccionado se sucedern diferentes ventanas para la creacin del considerablemente . En este libro vamos a estudiar un nico caso: la creacin de un

DSN, ya que la informacin necesaria en cada caso vara

DSN de sistema para Microsoft Access.

Agregar

Para crear un nuevo origen de datos de sistema, se tiene que pulsar el botn en la ventana mostrada en la Figura A.4. Al pulsar este botn, se

presenta el cuadro de dilogo

una lista que muestra todos los controladores

Crear nuevo origen de datos (Figura A.5) con ODBC instalados en el equipo.

Figura A.5: Seleccin del controlador Una vez elegido el controlador para el que se desea agregar un

DSN,

se

Por ejemplo, para un origen de datos en un chero de texto slo hace falta la ruta del

chero, mientras que para acceder a un servidor remoto puede hacer falta la direccin IP, el nombre de usuario, la contrasea, etc.

A.2. Creacin de un DSN

95

pulsa el botn

Finalizar

y aparece un cuadro de dilogo de conguracin

especco del controlador. En la Figura A.6 se muestra el cuadro de dilogo que posee el controlador para El cuadro de dilogo

Instalacin de ODBC para Microsoft Access DSN. El resto de opciones ODBC, pero slo es conveniente

Microsoft Access.

(Figura A.6) posee muchas opciones, pero slo hace falta pulsar un par de botones y rellenar un par de campos para crear un permite un control mayor de la conexin modicarlas si se posee conocimientos avanzados. El cuadro de texto

Nombre del origen de datos es el campo ms imporDescripcin, es

tante: en l indicamos el nombre (o alias) que se va a emplear en los programas para acceder a la base de datos. El siguiente cuadro de texto, una nueva. opcional. A continuacin, podemos elegir la base de datos si ya existe o crear

Figura A.6: Creacin de un DSN para Microsoft Access

Si ya tenemos creada la base de datos, pulsamos el botn el chero

Seleccionar...
que

y se abre el cuadro de dilogo de la Figura A.7. Desde aqu podemos localizar

.mdb

que contiene la base de datos en formato

Microsoft Access

96

Apndice A. Cmo crear un DSN

queremos emplear.

Figura A.7: Seleccionar una base de datos

Como se puede ver en la Figura A.7, el cuadro de dilogo posee un botn etiquetado

Red...

Este botn permite seleccionar una base de datos situada

en otro equipo. Esta situacin resulta muy interesante cuando se publica informacin en Internet, ya que al situar la base de datos en un equipo distinto al que ofrece el servicio web se est aadiendo un nivel de seguridad adicional. Si no tenemos creada la base de datos, pulsamos el botn caractersticas de la base de datos que deseamos crear:

Crear... y aparece

el cuadro de dilogo de la Figura A.8. En esta ventana tenemos que indicar las

Nombre de base de: indicamos el nombre que queremos asignar a la


base de datos (nombre del chero).

Directorios:
de datos.

seleccionamos el directorio donde queremos crear la base

Local: escogemos el idioma que emplea nuestro sistema operativo. Para evitar posibles problemas, escogemos Espaol moderno o Espaol tradicional.

A.2. Creacin de un DSN

97

Formato:

indicamos la versin de

Microsoft Access

que queremos que

posea la base de datos. Si queremos que la versin sea la misma que la empleada en

Microsoft Access

97, seleccionamos

Versin 3.x.

Figura A.8: Crear una base de datos Al pulsar el botn

Aceptar se crea una base de datos de Microsoft Access DSN,


cualquier programa que necesite acceder a la

vaca (en blanco): sin tablas, sin consultas, sin formularios, etc. Una vez creado un base de datos slo necesita conocer el nombre que posee el red) o se puede convertir a otro formato (a otro

DSN. La base de

datos se puede mover de sitio (incluso a otro equipo accesible a travs de la

SGBD) y en ambos casos, los

programas que acceden a ella no se tienen que modicar.

Bibliografa
[1] Eduardo Parra Murga. nications, Madrid. [2] Eric Ladd, Jim O'Donnell.

Diccionario de Internet.

PC World, IDG Commu-

and CGI.
1996.

Platinum Edition Using HTML 3.2, Java 1.1,


Sams.net Publishing,

Que, Macmillan Computer Publishing, 1996.

[3] Eugene Eric Kim.

CGI Programming Unleashed.

[4] H. M. Deitel, P. J. Deitel, T. R. Nieto.

to program.

Internet and World Wide Web. How

Prentice Hall, New Jersey, 2000.

[5] John December, Mark Ginsburg.

rence Edition.

HTML 3.2 and CGI. Professional RefeQue, Macmi-

Sams.net Publishing, 1996.

[6] Krishna Sankar.

Internet Explorer and ActiveX Companion. Special Edition Using HTML 4.

llan Computer Publishing, 1997. [7] Molly Holzschlag. Que, Macmillan Com-

puter Publishing, 1999. [8] Sergio Ros Aguilar.

Lenguajes HTML, Java y CGI. El diseo de pginas Web para Internet a su alcance. Abeto Editorial, Madrid, 1996.

99

ndice alfabtico
A
vase

+, 23, 58 .htx, 69, 71, 74, 77 .idc, 69, 71, 74 .inc, 61 .shtm, 49 .shtml, 49 .stm, 49 <!-- -->, 50 <HEAD>, 18 < % . . . %>, 73, 77 < %begindetail %>, 73, 77, 79 < %else %>, 77 < %enddetail %>, 73, 77 < %endif %>, 77 < %idc. %>, 78 < %if . . . then . . . else . . . %>, 77, 79 < %if %>, 77 =, 23 ?, 21, 24, 25, 28, 58 #, 51 %, 23, 24, 79 % %, 79 &, 23 101

Active Server Pages, AHTML, 8 Altavista, 5

ASP

American Standard Code for Information Interchange, ASCII Apache, 5, 6, 49 API, xiii, 87, 88, 90, 91 applets, 10 Application Program Interface,

vase

se

va-

API

ASCII, xiii, 11, 23 ASP, xiii, 9, 10, 58, 68

Bloc de notas, 6, 49, 70

C, xiv, 68, 13, 14, 19, 29, 32, 41, 49, 54, 62, 63 C++, 6, 8, 49 cdigos HTTP, 16 cabecera HTTP, 11, 13

102

ndice alfabtico

CGI, xiii, 211, 1315, 1719, 21 29, 31, 32, 36, 37, 39, 40, 4244, 49, 54, 57, 58 cgi, 58 CGI-HTML, 8 cgi-lib, 8 cmd, 58, 59 codicacin URL, 23 ColdFusion, 10 comentario en HTML, 50 Common Gateway Interface, CGI cong, 51 Content-Type, 75 Content-type, 13 CONTENT_LENGTH, 25, 26, 28, 40 CONTENT_TYPE, 25, 26, 28 CurrentRecord, 79

errmsg, 52 exe, 58 exec, 51, 58 Expires, 75 Extensible HyperText Markup Language,

vase

XHTML

Extensible Markup Language, XML

vase

vase
Fortran, 7

astmod, 51, 59

fsize, 51, 61 fuentes de datos, 92

Data Source Name, Datasource, 72, 74 Deereld.com, 44

GET, 17, 24, 25, 28, 29 getenv(), 29

vase

DSN

Google, 5

DefaultParameters, 75 DLL, xiv, 69 DNS, xiv, 27 Domain Name System, Dynamic Link Library,

HEAD, 25, 29

vase vase

HTML, xiv, 36, 10, 11, 13, 14, 18, DNS DLL 19, 26, 42, 4851, 54, 58, 59, 6163, 6973, 7577, 79 81, 84 HTTP, xiv, 3, 10, 11, 17, 25, 27, 39,

DSN, xiv, 71, 72, 74, 92, 94, 95, 97

echo, 51, 54

E
vase
cabecera

40, 44, 69 HyperText Markup Language,

se

va-

HTML

encabezado HTTP, HTTP

HyperText Transfer Protocol, HTTP

vase

ndice alfabtico

103

Microsoft, xiii, xv, 37, 44, 68, 90

IBM, xvi

92 Microsoft Access, 70, 72, 94, 95, 97 Microsoft Internet Explorer, 5, 6, 14, 15, 28, 29, 49, 70, 73, 82 Microsoft Internet Information Server, xv, 5, 6, 37, 49, 68, 70 Microsoft Personal Web Server, 6, 29, 37, 49, 50, 58, 70, 71 Microsoft SQL Server, 70

IBM OS/2, 90 IDC, xv, 6872, 74, 75, 77, 79, 80 include, 51, 61 Informix, 70 International Organization for Standards, Internet, 68 Internet Database Connector, IDC Internet Protocol, Interface, ISAPI, xv, 58, 69 ISINDEX, 18, 21 ISO, xv, 28

vase

ISO

vase

Microsoft Visual Basic, 44 Microsoft Windows, xiv, 6, 29, 44, 49, 70, 88, 92 Microsoft Word, 11 middleware, 88 MIME, xv, 11, 13, 28, 44, 75 MS-DOS, 19 Multipurpose Internet Mail Extensions,

vase vase

IP ISAPI

Internet Server Application Program IP, xv, 5, 9, 27, 29

vase

MIME

Java, xv

J
vase
JSP

Netscape Communicator, 5, 6, 14, 28, 49, 70 nph-, 17

Java Server Pages, joe, 6, 49, 70 JSP, xv, 9, 10, 68

Linux, 6, 49, 70 Location, 14

O'Reilly & Associates, 44 O'Reilly WebSite Professional, 44 ODBC, xv, 6870, 74, 77, 88, 90 92, 94, 95 ODBCConnection, 76 ODBCOptions, 77 Open Database Connectivity, ODBC

MaxFieldSize, 75 MaxRecords, 76, 79

vase

104

ndice alfabtico

operadores de IDC, 78 orgenes de datos, 92

SQL, xvi, 69, 71, 72, 74, 75, 79, 80, 82, 8587, 91 SQLStatement, 72, 74, 75 SSI, xvi, 42, 4852, 54, 5658, 62 Standard Generalized Markup Language, Status, 15 Structured Query Language, SQL Sun Microsystems, xv, 68 syntax highlight, 7, 49

Pascal, 6, 7, 49 Password, 76 PATH_INFO, 17, 26, 28 Perl, xiv, 68, 43, 49 PHP, 9, 10 plug-ins, 11 POST, 17, 25, 28, 29, 40, 45 Python, 7 TCL, 7

vase

SGML

vase

T
vase
MIME

QUERY_STRING, 17, 18, 2426, 28

Q R

TCP/IP, xvi, 88 Template, 72, 74, 75 timefmt, 52, 54, 59 tipos MIME, Translationle, 76

Request for Comments, RequiredParameters, 76 RFC, xvi

vase

Transmission Control Protocol/Internet RFC Protocol,

vase

TCP/IP

REQUEST_METHOD, 25, 26, 29

Universal Resource Locator,

vase

script, 58

S
vase
SSI

URL Unix, 6, 9, 37, 43, 49, 54, 90 URL, xvi, 3, 17, 18, 21, 22, 2428, 69 Username, 77

sendmail, 9 Server Side Include, servlets, 10

SGBD, xvi, 3, 87, 88, 9092, 97 SGML, xvi Sistema Gestor de Bases de Datos,

vase

variable de entorno, 54 variable de entorno CGI, 26, 54 variable de entorno SSI, 54

SGBD

sizefmt, 52, 54, 61

ndice alfabtico

105

variables especcas de la peticin, 28 variables especcas del cliente, 27 variables especcas del servidor, 26 VBScript, xiii

W3C, xvi

W
vase
WWW

WinCGI, 44 World Wide Web,

World Wide Web Consortium,

se

va-

W3C

WWW, xvii

XHTML, xvii XML, xvii

Yahoo, 5