Tutorial CGI I
II III Introducción a SQL Tutorial VBScript |
|||||||||||||||||
Tutorial de CGI III Imagenes Clikeables. A pesar que este tipo de elementos no este conectado directamente con los scripts CGI pense en incluirlos dado que tambien son una de las formas de incrementar la interactividad entre los usuarios y el web site. Basicamente una imagen clikeable (es una acepcion que invente, ya fue, la que me parecio mas correcta en castellano) es una imagen, un grafico que cuando es clikeada en alguna de sus partes envia las coordenadas X e Y de la posicion del Mouse en ese momento y el server a partir de ellas genera un enlace con otras paginas. El uso mas comun de este tipo de imagenes es crear barras de herramientas personalizadas o regiones en un grafico que permitan al usuario navegar hasta un nuevo documento. En teoria existen tres formas de lograr este tipo de imágenes;
Como todos los Web servers de la actualidad soportan la segunda forma, descartaremos la revision de la primera y comenzaremos directamente a usar el tag ISMAP. Partiendo de una imagen (un .GIF)
elegiremos dentro de ella las areas que funcionaran como links a otros documentos. RECT(x1,y1)(x2,y2) Determina un area
rectangular en base a los vértices de su diagonal principal. Almacenaremos estos elementos en un archivo que tendrá mas o menos el siguiente formato:
Usando un paquete gráfico cualquiera y
revisando la posición del cursor podremos construir este tipo de archivos, el único
problema es que nos puede resultar bastante tedioso hacerlo "a mano". Veamos entonces la estructura del
archivo. La primera línea linkea el documento que será cargado en caso de que no
clikeemos en ninguna de las areas especificadas por los elementos que definimos. Si
omitimos el tipo de elemento el server tomara por default el RECT. <A HREF="/maps/dibujo.map"><IMG SRC="imagenes/barrita.gif" BORDER=0 ISMAP></A> Entonces una vez cargada pla página en nuestro browser, cad vez que clikeemos en alguna parte de la imagen, el browserenviara las coordenadas de ubicación en la que nos encontrábamos (esos numeritos que aparecen en la barra de status) al server, y luego de esperar su proceso, este ultimo nos devolvera la respuesta correspondiente. Este mecanismo (Server-Side), induce un cierto retardo (el proceso por parte del server de nuestro pedido) por lo cual recientemente Netscape introdujo un nuevo mecanismo conocido como Client-Side Image Maps el cual veremos a continuación. Client-Side Image Maps <map
name="barradetaresas"> y el link en el tag img quedaría as´: En mapname definimos el nombre del mapa y en usemap lo referenciamos. Al probarlo podremos ver que en la barra de status no aparecen las coordenadas sino directamente el nombre de la pagina en cuestion. Si utilizamos nombres de pagina significativos esto puede ser de gran ayuda para el usuario. Este metodo obviamente es mucho más
rapido (no implica un intercambio de informacion con el server) pero tiene la desventaja
de que no esta implementado en todos los browsers todavia, a peras de que sta propuesto
como estándar para la definicion del HTML 3.0. <a
href="/maps/dibujo.map"> Si el browser no llegara a entender el usemap, procesara nuestro pedido en base al link del ismap. Desempaquetando Información. Aunque este tema puede resultar algo
"tecnico" creo que resulta interesante incorporarlo al tutorial, ya que
nos permite conocer el funcionamiento de esas "cajas negras" que son las
librerías, las cuales hemos utilizado al programar nuestros scripts. La variable QUERY_STRING puede
almacenar solamente un string continuo sin espacios, de manera que para enviar varios
campos (y espacios) debe existir algún tipo de codificación de los mismos.
Como deciamos estos datos deben de ser empaquetados en un único string, estyo se hace poniendo un "&" (ampersand) entre cada variable y reemplazando cada esepacio por un signo "+", con lo cual conseguimos que la variable quede asÍ:
Adicionalmente ciertyos caracteres son reemplazados por su valor ASCCI en un formato hexadecimal (%xx). Como vemos, esta ensalada de letras es imposible de manejar tal como esta, por lo tanto recurriremos a los "parsers" cuya función es la de separar estos valores en cómodas y agradables variables. Parsers CGI La rutina escrita en Perl es un poco
(sólo un poco) más clara que su correspondiente equivalente en C, por lo tanto la
utilizaremos para la explicación del funcionamiento de un parser. Lo que sigue es la rutina &ReadParse ( que figura en la libreria "cgi-lib.pl" de S.E.Brener ) comentada ampliamente para su mejor entendimiento
Esta no es la unica librería que existe para manejar CGI bajo Perl, pero si la más utilizada. Según el autor nuevas versiones incorporan más facilidades, tales como file uploading y otras. Locking de archivos En la segunda parte de este documento
plante, el hecho problematico de que dos usuarios pretendan acceder al mismo tiempo a un
mismo archivo, como es el caso del mini.guestbook. Cuan dos usuarios quieren leer/escribir
un mismo archivo (en realidad los scripst llamados por ellos)se produce un conflicto, el
de saber quien tien la prioridad al hacerlo. Una manera de resolver este conflicto es
crear un archivo "lock" cuya sola presencia nos indique que el archivo esta
siendo accedido en ese momento.
Scripts avanzados A partir de este punto analizaremos en detalle los requisitos para el manejo de documentos dinamicos, profundizando en el conocimiento de la forma de trabajo del protocolo HTTP y los mensajes MIME. Documentos Dinamicos Para introducirnos en el tema de los documentos dinamicos nos basaremos en una aplicación practica, la animación, es decir imágenes en movimiento sin dejar de lado el hecho de que esta ultima es solo una de las multiples posibilidades que nos brinda el manejo dinamico de la información. Actualmente existen tres metodos (si incluimos el gif multipart) para poder manejar información dinamicament, en orden de eficiencia estos son:
Analicemos en detalle cada uno de los metodos. Client Pull <META HTTP-EQUIV="Refresh"
Content="1"> Y???Que, paso?, por el bien de este tutorial espero que el documento haya sido recargado por el browser al pasar un segundo. Esto lo logramos al agregar el tag
"META" ( el cual permite simular respuestas HTTP en paginas HTML) que le dice al
browser que el server le esta enviando un header con la indicación "Refresh:1". <META HTTP-EQUIV="Refresh" CONTENT=10; URL=http://mimaq.midominio/dinamic.html> Que hara que el browser luego de diez segundos de haber cargado la primera pagina vaya y traiga la que se encuentre referenciada por la variable URL. Un detalle importante es que debemos utilizar URLs absolutos , es decir incluir en la definición el "http://...." y no emplear URls relativos Y que parsaría si hacemos lo siguiente: <META HTTP-EQUIV="Refresh" CONTENT=3; <META HTTP-EQUIV="Refresh" Content=3 URL=http://mimaq.midominio/seg.html> URL= http:// mimaq.midominio//pri.html> Más de uno se habra dado cuenta de que
estos documento se llaman el uno al otro cada tres segundos, generando una especie de loop
infinito . Pagina 1 Un ejemplo de utilización practica de está tecnica ocurre en aquellas paginas que nos indican que la pagina original ha cambiado de lugar y que n cinco segundos seremos automaticamente redireccionados a la nueva ubicación. Server Push En contraste con el Client Pull, este
mecanismo aprovecha que el serer puede mantenerse una conexion abierta por un tiempo
indefinido, dejando espacio para que sean enviadas varias respuestas secuencialmente. Mensaje MIME multipart Un mensaje MIME multipart está compuesto de un header y una o más partes que componen la totalidad del mensaje. El header indica como deben ser procesadaslas distintas partes del mensajey cuales son los separadores de las mismas, por ejemplo: Conten-Type: multipart/x-mixed-replace;boundary=SeparaPartes Cuando el cliente encuentra este tipo en el header, hace un refresh del sector correspondiente cada vez que una nueva parte del mensaje llega, sobreescribiendo de esta manera la anterior. Cada parte del mensaje tiene su propio header, el cual indica el tipo de datos que esa parte contiene. "plain text", un grafico GIF o HTML por ejemplo. El header de cada parte siempre se encuentra debajo del separador que hallamos especificado(en la linea que vimos le pusimos "SeparaPartes" de nombre al separador, pero podriamos haber utilizado cualquier otro). El server indica el fin de un mensaje multipart enviando un separador con el agregado de dos guiones, por ejemplo nuestro separador quedaría; --Separa Partes El script que sigue es una version reducida del NPH 1.2 creado por Matt Wright y en el veremos una implementadión comentada del mecanismo que acabamos de describir.
Lo unico que me quedaría por aclarar es que ya el tipo "x-mixed/replace" fue definido por Netscape, solamente funcionara con su browser version 1.1 y posteriores GIF multipart En este caso no tendremos que programar
nada y es por lejos la forma mas simple de armar una animación, aunque mantiene la
desventaja de ser visualizados unicamente por Netscape 2.0 o posteriores.
Ya que el Gif Construction Set trae un
Help bastante completo y es sencillo de usar, no quisiera extenderme más en el tema. SI nos desidimos por usar este
metodotengamos en cuenta lo siguiente: Counters Implementar un "counter" no
es una tarea muy dificil. Basicamente se graba en un archivo el valor del contador, y cada
vez que se hace un nuevo acceso a la pagina controlada, se lee este archivo, se incrementa
en uno el valor leido y se vuelve a grabar. Veremos un fragmento de script que hace esta
tarea.
Paginas Web con protección por password Para no dejar de lado el tema de la
seguridad abordaremos el uso de passwords en el acceso a un servidor web. El metodo se basa principalmente en poner a cada directorio a proteger un archivo de nombre ".htaccess" que contiene los parametros de configuración de la protección implementada y el nombre del archivo que contiene los passwordsque normalmente es el ".htpasswd". El archivo ".htaccess" Este archivo debe estar ubicado en el
directorio que se desea proteger y dicha protección afectara a todos los subdirectorios
del mismo , a menos que posean sus propios archivos ".htaccess".
Descripcion de los parametros AutUserFile: Es el nombre del archivo que contiene los nombres de los usuarios (Users ID) y sus respectivos Passwords. Este archivo debe estar ubicado en el mismo directorio que ".htaccess" pero puede llevar cualquier nombre. por convencion le daremos el nombre de ".htpasswd". AuthGroupFile: Este es el nombre del archivo de grupo. Podemos setear grupos de usuarios para que tengan acceso a un directorio, en el caso del ejemplo no tenemos un archivo de estos armado, por lo que direccionamos a null que significa que no existe un archivo de grupos. AuthName: Es el strig que aparecera en la ventanita que levanta el browser , cuando se le pregunte al usuario su ID y Password. AuthType: Es la clase de seguridad que
implementamos . "Basic" significa Autentificación Basica HTTP, es decir que la
información enviada a travez de la red no sera encriptada sino que sera
"uuencodeada" (uuencoded), lo cual nos da un nivel de proteccion similar al de
una sesion de telnet. En el ejemplo que vimos solamente el metodo GET esta restringido usando la directiva <limit>. Para limitar otras metodos (particularmente en los directorios CGI-BIN) se puede especificar los mismos separados por espacios dentro de la directiva limit. Por ejemplo: <Limit Get Post Put> Restringiendo el acceso a los
documentos de ese directorio a aquellas maquinas que se encuentren en el dominio
.mencor.ar y excluyendo a los restantes. El archivo .httpasswd Por ejemplo: pedro:WkSK1DE7N8.9 Como no podemos crear un password
encriptado a mano usaremos una herramienta llamada htpasswd que permite construir este
tipo de archivos. Server<htpasswd-c.htpasswd USUARIO Si queremos modificar el password de USUARIO en otro momento usamos la misma sintaxis . Para eliminar usuarios simplemente se borra la linea correspondiente dentro del archivo. Proteccion a nivel de grupo nombregrupo1:primeruser
segundouser................nuser y debemos cambiar el requiere por un "require group nombregrupo". |