Вы находитесь на странице: 1из 24

Ja v i e r E .

P r e z D e l g a d o

Javier Prez Delgado

Tutorial de CGI

INTRODUCCIN
El CGI (Common Gateway Interface) es un estandar para comunicar aplicaciones externas con los servidores de informaci n! tales como servidores "TTP o Web# $n documento en "T%& 'ue el daemon del Web se trae es est(tico! es decir! se mantiene constante) un fic*ero de texto 'ue no cam+ia# $n programa CGI! por otro lado es e,ecutado en tiempo real! as- 'ue puede generar informaci n din(mica# Por e,emplo! supongamos 'ue 'uieres enganc*ar tu +ase de datos de $nix al ...! para permitir a gente de todo el mundo consultarla# /(sicamente se necesitar( un programa CGI 'ue el daemon del Web e,ecutar( para transmitir la informaci n al gestor de +ase de datos! 0 reci+ir los resultados para presentarselos al cliente# Este es un e,emplo de pasarela (gateway)! 0 es lo 'ue CGI! actualmente en su versi n 1#1! tiene en sus or-genes# El e,emplo de la +ase de datos es una idea sencilla! pero la ma0or-a de las veces dificil de implementar# 2ealmente no *a0 l-mite con lo 'ue tu 'uieras enganc*ar al .e+# &a -unica cosa 'ue de+es recordar es 'ue *aga lo 'ue *aga tu progrma CGI! no de+er( tardar muc*o tiempo en procesar# De otra manera! el usuario estar-a esperando con su navegador a 'ue algo pase#

Especificaciones
Como un programa CGI es un e,ecuta+le! es e'uivalente a de,ar a el mundo e,ecutar un programa en tu sistema! 'ue no es lo mas seguro a *acer# Por ello existen una serie de precauciones de seguridad 'ue son necesarias de implementar cuando se usan programas CGI# Pro+a+lemente la 'ue afectar( al usuario t-pico del Web! es 'ue *ec*o de 'ue los programas CGI necesitan residir en un directorio especial! as- el servidor sa+e 'ue tiene 'ue e,ecutarlo! en vez de simplemente mostrarlo por pantalla# Este directorio est( generalmente +a,o el control del webmaster! pro*i+iendo al usuario medio crear programas CGI# "a0 otros mtodos para permitir el accesos a scripts CGI! pero depende del webmaster 'ue se te de esta posi+ilidad# 3s- 'ue de+er(s contactar con tu webmaster para consultar la facti+ilidad de permitirte un acceso a los CGI# 4i dispones de una versi n del servidor HTTPd NCSA! ver(s un directorio denominado /cgi-bin# Este es el directorio especial antes mencionado! donde todos los programas CGI residen# $n programa CGI se puede escri+ir en cual'uier lengua,e 'ue permita ser e,ecutado en el sistema! como) C5C66 7ortran PE2& TC& 3lg8n 4*ell de $nix 9isual /asic 3pple4cript 4implemente depende de lo 'ue tengas en tu sistema# 4i usas un lengua,e de programaci n como C o Fortran! como 0a sa+r(s! de+es compilar el programa antes de poder e,ecutarlo# 4i miras en el directorio /cgi-src! encontrar(s el c digo fuente de algunos programas CGI del directorio /cgi-bin# Pero! si usas alguno de los lengua,es
:

Javier Prez Delgado

Tutorial de CGI

interpretados! como PE !! TC!! o un s*ell de "ni#! el script simplemente necesita residir en el directorio 5cgi;+in! 0a 'ue no tiene un c digo fuente asociado# %uc*a gente prefiere escri+ir scripts CGI en vez de programas! 0a 'ue son m(s f(ciles de depurar! modificar 0 mantener 'ue un programa t-pico compilado#

Qu es el directorio cgi-bin
Este es un directorio especial! 'ue contiene los scripts! configurado dentro del servidor *ttp# El servidor conoce 'ue este directorio contiene e,ecuta+les 'ue de+er(n ser e,ecutados 0 su salida de+er( ser enviada al navegador del cliente# <o se puede simplemente crear un directorio cgi-bin! el administrador del servidor de+er( configurarlo para su uso# 4i no est( configurado! los scripst ser(n cargados como simples fic*eros de texto# 3lgunos servidores est(n configurados de tal manera 'ue los fic*eros con una determinada extensi n (generalmente $cgi) son reconocidos como scripts 0 ser(n e,ecutados como si estuvieran en un directorio cgi-bin# <ota) <o de+eremos confundirlo con %tm& ana&i'ado (generalmente $s%tm&) &a configuraci n de los directorios! o de la extensi n mencionada antes! depende 8nicamente del servidor# Comprue+a la documentaci n so+re tu servidor! o pregunta a otro usuario 'ue tam+in lo use#

Qu parte es !erl" # $u parte es %t&l


El formulario 'ue se presenta al usuario est( escrito en %tm&! 0 este llama al script en el servidor escrito en (er& # El script devolver( en la ma0or-a de los casos c digo %tm& para presentar al usuario#

'(RI()*E+ DE ENTORNO EN C,I


El servidor usa tanto de l-neas de comando! como varia+les de entorno para pasar los datos del servidor al script# Estas varia+les de entorno se activan cuando el programa e,ecuta el programa cgi#
=

Javier Prez Delgado

Tutorial de CGI

Especificaci-n &as siguientes varia+les no dependen de la informaci n enviada 0 son activadas en todos los casos) 4E29E2>4?7T.32E Devuelve el nom+re 0 la versi n del soft@are del servidor de informaci n 'ue contesta la petici n de usuario (0 e,ecuta el programa cgi)# 7ormato) nom+re5versi n#

4E29E2><3%E Devuelve nom+re de *ost del servidor! el alias D<4! o la direcci n IP como aparecer-a en las $2& autoreferenciadas# G3TE.3A>I<TE273CE Devuelve la revisi n de la especificaci n CGI con 'ue el servidor puede tra+a,ar# 7ormato) CGI5revisi n# &as siguientes varia+les de entorno son espec-ficas de la petici n de usuario! 0 es el programa del gateway el 'ue las da el valor) 4E29E2>P2?T?C?& Da el nom+re 0 revisi n del protocolo de informaci n con el 'ue la peticion de usuario viene# 7ormato) protocolo5revisi n# 4E29E2>P?2T Devuelve el n8mero de puerto por el cual fue enviada la petici n# 2EB$E4T>%ET"?D Devuelve el mtodo por el cual la petici n fue enviada# Para "TTP ser(n CGETC! C"E3DC! CP?4TC! etc# P3T">I<7? &a informaci n extra so+re el (at%! tal como es dada por el cliente# En otras pala+ras! podemos acceder a los scripts por su (at%name virtual! seguido de alguna informaci n extra# Esa informaci n extra es enviada como P3T">I<7?# &a informaci n ser( decodificada por el servidor si viene de una $2& antes de pasarla al script CGI# P3T">T23<4&3TED El servidor proporciona una versi n traducida del P3T">I<7?! 'ue transforma el (at% virtual al f-sico#
D

Javier Prez Delgado

Tutorial de CGI

4C2IPT><3%E Pat* virtual al script 'ue va a e,ecutar! usado para autoreferenciar $2&# B$E2A>4T2I<G &a informaci n 'ue sigue al signo EFG en la $2& 'ue referencia al script# Es la informaci n de la pregunta# <o de+er( ser decodificada de ning8n modo# Esta varia+le ser( activada cuando *a0 una petici n de informaci n! sin *acer caso de la decodificaci n de la l-nea de comandos# 2E%?TE>"?4T El nom+re de %ost 'ue realiza la petici n# 4i el servidor no posee esta informaci n activar( 2E%?TE>3DD2 0 de,ar( esta desactivada# 2E%?TE>3DD2 &a direcci n IP del %ost remoto 'ue realiza la petici n# 3$T">TAPE 4i el servidor soporta autentificaci n de usuario ! 0 el script est( protegido! esta es el mtodo de autentificaci n espec-fico del protocolo para validar el usuario# 2E%?TE>$4E2 4i el servidor soporta autentificaci n de usuario ! 0 el script est( protegido! este ser( el nom+re de usuario con el 'ue se *a autentificado# 2E%?TE>IDE<T 4i el servidor "TTP soporta autentificaci n 27C H=1 ! entonces est( varia+le se activar( con el nom+re del usuario remoto o+tenido por el servidor# Esta vari+le solo se utilizar( durante el &ogin# C?<TE<T>TAPE Para peticiones 'ue tienen informaci n aIadida! como "TTP P?4T 0 P$T! este ser( el tipo de datos contenido# C?<TE<T>&E<GT" &a longitud del contenido tal como es dado por el cliente# 3dem(s! las l-neas de la ca+ecera reci+idas por el cliente! si las *a0! son colocadas en el entorno con el prefi,o "TTP> seguido del nom+re de la ca+ecera# Cada car(cter de el nom+re de la ca+ecera se cam+ia por caracteres ># El servidor puede excluir algunos caracteres 'ue 0a *a0a procesado! como la autorizaci n#

Javier Prez Delgado

Tutorial de CGI

El tipo de contenido 0 la longitud de este! pueden ver suprimidas sus ca+eceras si al incluirlos se excede el l-mite de entorno del sistema# $n e,emplo de esto es la varia+le "TTP>3CCEPT 'ue se defini en CGI51#K# ?tro e,emplo es la ca+ecera $4E2>3GE<T# "TTP>3CCEPT &os tipos %I%E 'ue el cliente aceptar(! como son dados por las ca+eceras "TTP# ?tros protocolos pueden ser necesarios para o+tener esa informaci n de alg8n otro lugar# Cada elemento de esta lista de+er( estar separado por comas por la especificaci n "TTP# 7ormato) tipo5su+tipo! tipo5su+tipo "TTP>$4E2>3GE<T El navegador 'ue el cliente usa para mandar la petici n# 7ormato general) soft@are5versi n li+rer-a5versi n#

*E.ENDO E* /OR0U*(RIO DE ENTR(D( DE U+U(RIO


Cuando el usuario env-a el formulario! el script reci+e los datos como pares nom+re;valor# &os nom+res son lo 'ue definimos en las eti'uetas I<P$T (o las eti'uetas 4E&ECT o TELT32E3)! 0 los valores a'uello 'ue el usuario *a0a escrito o seleccionado# (&os usuarios tam+in pueden enviar fic*eros con los formularios! pero no nos ocuparemos de ello#) Estos pares nom+re;valor llegan como una larga cadena 'ue necesitamos formatear# <o es mu0 complicado! *a0 una gran cantidad de rutinas 'ue lo *acen por t-# En el directorio CGI de Aa*oo encontrar(s unas cuantas en varios lengua,es# 4i aun as- prefiere *acerlo usted mismo! a'u- esta el formato de la cadena) Mnom+re1Nvalor1Onom+re:Nvalor:Onom+re=Nvalor=P

Javier Prez Delgado

Tutorial de CGI

3s- 'ue s lo *a0 'ue dividir donde est(n los signos EOG 0 ENG! 0 luego *acer dos cosas a cada nom+re 0 valor) 1#Convertir todos los signos E6G a espacios# :#Convertir todas las secuencias ERxxG al valor del car(cter cu0o valor 34CII sea ExxG en *exadecimal# Por e,emplo convertir ER=dG a ENG# Esto se *ace necesario por'ue la larga cadena original esta codificada seg8n el c digo $2&! para permitir los signos EOG! ENG! 0 todo lo 'ue el usuario introduzca# Pero! Sde donde se o+tiene la cadena de entradaF Esto depender( del mtodo por el cual el formulario *a0a sido enviado) Para los env-os con GET! ser( la varia+le de entorno B$E2A>4T2I<G# Para los env-os con P?4T! *a+r( 'ue leer del 4TDI<# El n8mero exacto de +0tes a leer estar( en la varia+le de entorno C?<TE<T>&E<GT"#

DE'O*'IENDO *( RE+!UE+T( (* U+U(RIO


Primero! escri+ir la linea
Content-Ty(e) te#t/%tm&

m(s otra l-nea en +lanco en el 4TD?$T# Despus! escri+iremos nuestra pagina de respuesta en "T%& al 4TD?$T! 0 ser( enviada al usuario cuando el script est e,ecutado# 4-! estamos generando c digo en "T%& en tiempo real# <o es dif-cil! si no m(s +ien directo# El c digo "T%& fue diseIado lo suficientemente simple para poder ser generado por este mtodo#

Javier Prez Delgado

Tutorial de CGI

,U(RD(NDO *( ENTR(D( DE* U+U(RIO EN UN (RC1I'O


En este apartado vamos a guardar los datos escritos por el usuario en un arc*ivo para poder recuperarlos posteriormente# Como e,emplo utilizaremos un formulario para enviar c*istes# Este formulario o+tendr( la siguiente informaci n 0 lo guardar( en las varia+les indicadas entre parntesis) <om+re del $suario (nom+re) $n C*iste (c*iste) Para ello creamos un formulario simple con el siguiente c digo)
*form met%od+,P-ST, action+,%tt()//www$./a$es/cgi-bin/c%iste-en/io$(&,0 *P0T. nombre) *in(.t name+,nombre,0*/P0 *P0E& c%iste) *te#tarea co&s+12 rows+3 name+,c%iste,0*/te#tarea0*/P0 *P0*in(.t ty(e+,s.bmit, /a&.e+,En/iar,0*4 0 *in(.t ty(e+,reset, /a&.e+,4orrars,0*/P0 */form0

<uestro programa colocar( est( informaci n para 'ue la podamos dar el visto +ueno# El programa devolver( una nota al usuario indic(ndole 'ue su env-o ser( revisado m(s tarde#

Javier Prez Delgado

Tutorial de CGI

Por consistencia ! llamaremos a este script c*iste;envio#pl# <ecesitamos iniciar 0 comentar nuestro script# $tilizaremos la li+rer-a cgi;li+#pl de 4teve /rennerGs para facilitar la entrada de formularios## 4eguiremos con el script 'ue co,a la entrada 0 devuelva e siguiente mensa,e) Gracias >nom+re>! tu env-o ser( revisado en +reve# El script 'ue realiza esto es el siguiente)
56/.sr/&oca&/bin/(er& 5 c%iste-en/io$(& 5 Por 7a/ier P8re' 9e&gado :;(ere'<ct/$es= 5 5 Este scri(t a>ade e& c%iste a& arc%i/o de c%istes$ 5 9e/.e&/e .na nota a& .s.ario? indicando @.e s. c%iste serA re/isado$ (.s%:<INC?,/(/www/%tt(d/cgi-bin/,=B re@.ire:,cgi-&ib$(&,=B C eadParseB (rint CPrintHeaderB (rint ,*HTD!0*HEA90En,B (rint ,*TIT!E0 econocimiento de c%iste*/TIT!E0En,B (rint ,*/HEA90*4-9F0En,B (rint ,Gracias ,?GinHInombreIJ?,?T. en/Ko serA re/isado &o antes (osib&e$ $*P0En ,B (rint ,*/4-9F0*/HTD!0En,B

3*ora al tema central! aIadir a un arc*ivo# Para *acerlo necesitamos un arc*ivo con permiso de escritura para el daemon %tt(# &a creaci n de este arc*ivo variar( entre distintos sistemas! 0 necesitaras consultar a tu @e+master# En este caso usaremos el arc*ivo)
/.sers/;(ere'/www/t.tor/c%iste$t#t

Para a+rir el fic*ero para aIadir al final usaremos el comando de perl para a+rir fic*eros! 'ue tiene la siguiente sintaxis)
o(en:FI!EHAN9!E?,00nombrearc%i/o,=B

7I&E"3<D&E es como llamaremos al arc*ivo mientras est a+ierto# Es similar a una varia+le# <om+rearc*ivo es el arc*ivo a a+rir# &os signos Ema0orG (VV) son importantes! 0 como en el s*ell indican EaIadir a un fic*eroG# 3s- la orden de apertura 'uedar( as-)
o(en:CHISTE?,00/.sers/;(ere'/www/t.tor/c%iste$t#t,=B

<ota) Es aconse,a+le usar letras ma08sculas para 7I&E"3<D&E para a0udar a distinguirlo de las varia+les# Escri+ir a un fic*ero es idntico a como *icimos previamente# &a 8nica diferencia es 'ue el 7I&E"3<D&E es el primer argumento de la sentencia (rint? 0 est( separado de

Javier Prez Delgado

Tutorial de CGI

lo 'ue ser( imprimido por un espacio# Por e,emplo para escri+ir la linea M&as rosas son ro,asP al 7I&E"3<D&E C"I4TE! escri+iremos)
(rint CHISTE ,!as rosas son ro;asEn,B

Escri+ir varia+les se realiza de la misma manera)


(rint CHISTE ,!as rosas son ,?GinHIco&orrosasIJ?,En,B

El c digo para nuestro e,emplo necesitar( escri+ir al arc*ivo) 1# El nom+re del usuario precedido con la cadena M<om+re)P :# $na l-nea en +lanco# =# El c*iste enviado# D# $na l-nea con JK guiones# El c digo es el siguiente)
(rint CHISTE ,Nombre) ,?GinHInombreIJ?,En,B (rint CHISTE ,En,B (rint CHISTE GinHIc%isteIJ?,En,B (rint CHISTE ,--------------------------------------------------En,B

3*ora solo nos 'ueda cerrar el fic*ero! 0 esto lo *acemos con el comando)
c&ose FI!EHAN9!EB

1K

Javier Prez Delgado

Tutorial de CGI

DE'O*'IENDO UN( !2,IN( QUE NO 1E0O+ ,ENER(DO


En este apartado crearemos un li+ro de visitas sencillito# Durante el proceso de realizaci n! *aremos +astantes cosas de forma ordenada# Devolveremos una p(gina *tml 'ue nosotros no *a+remos creado en tiempo real# Esto se *ace principalmente para demostrar la directiva de localizaci n# "a0 'ue verificar 'ue todos los campos tienen una entrada! 0 'ue la direci n de correo electr nico tiene un s-m+olo arro+a (W)# Editar un documento *tml con un script! insertando informaci n en el medio# 9amos a empezar creando un formulario 'ue co,a la siguiente informaci n en las varia+les indicadas entre parntesis# <om+re (nom+re) email (email) comentarios (comentarios) Colocamos un comentario en "T%& 'ue contenga la cadena CI<4E2T32 3B$XC en el formulario donde va0amos a insertar las nuevas entradas#
*6--INSE T HE E--0

Este formulario llamar( al script! g.estbooL$(&# El formulario g.estbooL$%tm& ser( el siguiente)


*69-CTFPE HTD! P"4!IC ,-//IETF//9T9 HTD!//EN,0 *%tm&0 *6--Co(yrig%t MNN1 7a/ier P8re' :;(ere't/$es=--0 *%ead0 *tit&e0!ibro de /isitas*/tit&e0

11

Javier Prez Delgado */%ead0 *body0 *%M0Firma e& form.&ario*/%M0 *P0Por fa/or? re&&ena todos &os cam(os)*/P0 *%r0 *form met%od+P-ST action+,%tt()//www$ct/$es/cgi-bin/g.estbooL$(&,0 *P0*in(.t name+,nombre,0*4 0 Nombre*/P0 *P0*in(.t name+,emai&,0*4 0 9irecciOn e-Dai& P9ebe tener .na arroba <Q*/P0 *P0*te#tarea rows+R co&s+S2 name+,commentarios,0*/te#tarea0*4 0 Comentarios)*/P0 *P0*in(.t ty(e+,s.bmit, /a&.e+,A>adir t.s comentarios,0*4 0 *in(.t ty(e+,reset, /a&.e+,4orrar form.&ario,0*/P0 */form0 *H 0 *6--INSE T HE E--0 *P0T&tima modificaciOn UM/N/N1 */body0 */%tm&0

Tutorial de CGI

Como se puede ver! los nom+res ser(n aIadidos al final del formulario# Estos son los pasos para realizar nuestra tarea) 1# 9erificar la entrada! devolviendo un mensa,e de error si *a0 un pro+lema# :# $raremos un +lo'ueo de arc*ivo denominado Edel po+reG# Creando un nuevo arc*ivo denominado# 4i este arc*ivo existe el programa se detendr( durante un segundo 0 lo volver( a intentar# =# 3+riremos 0 leeremos el arc*ivo del li+ro de firmas actual) g.estbooL$%tm&$ D# /orraremos este arc*ivo! 0 escri+iremos un nuevo fic*ero 'ue consistir( en la antigua informaci n con toda la nueva en el sitio apropiado# $saremos el comentario YZ;;I<4E2T32 3B$X;;V como marcador donde aIadir entradas# <ota) Puede ser desea+le *acer una copia de seguridad del arc*ivo! antes de +orrarlo# <o lo *acemos en este e,emplo! pero lo recomiendo en cual'uier desarrollo# 4e podr( *acer por cual'uier mtodo! incluido una llamada al sistema para copiar (cp)#

1:

Javier Prez Delgado

Tutorial de CGI

J# 2etornar una directiva de lugar apuntando a una p(gina de agradecimiento 'ue 0a *a0amos preparado# Q# Des+lo'uear +orrando el arc*ivo #guestloc[# ?+viamente! este no es el me,or li+ro de visitas! pero servir( como un +uen e,emplo! 0 es f(cilmente amplia+le# Empecemos) 1# Como es *a+itual nuestro script de+er( empezar con una llamada al Perl! los comentarios apropiados! 0 una llamada a la rutina 2eadParse# <o lo detallaremos a'u-! 0a 'ue se *izo anteriormente# :# Para empezar de+emos verificar los datos de entrada# <os 'ueremos asegurar de 'ue no *a0 campos en +lanco! 0 de 'ue la direcci n e;%ail contiene una arro+a (W)# Para venta,a nuestra! las cadenas nos vienen dadas sin los espacios en +lanco! ,usto igual 'ue los navegadores cuando presentan p(ginas *tml# Esto significa 'ue solo de+emos compro+ar 'ue ninguna de las cadenas es igual a la cadena vac-a! MP# En perl! como en muc*os lengua,es! las cadenas se comparan de manera diferente a los n8meros# $saremos Ee@G para compro+ar la igualdad de cadenas! 0 el signo ENNG para compro+ar la igualdad de n8meros# $searemos EneG 0 EZNG respectivamente para las comparaciones Eno igualG# Podemos *acerlo de la siguiente manera)
if :GinHInombreIJ e@ ,,= H 5 Hay .na cadena /acKa? de/o&/er mensa;e de error 5 sa&imos a& fina& de& scri(t a%ora? tenemos .n error e#itB J

Como podr(s adivinar! 3*ora no ponemos el c digo para devolver el mensa,e de error! en el e,emplo de arri+a# 38n as- muestra lo facil 'ue es compro+ar 'ue un campo est( vac-o# <ota) &os parntesis () 0 las llaves (\]) son importantes# &os parntesis contienen lo 'ue se est( compro+ando como verdadero o falso! 0 las llaves contienen las sentencias a e,ecutar si es verdadero# Como vamos a realizar varias compro+aciones de cadenas vac-as! 0 vamos a devolver el mismo error para todas ellas! podemos incluirlas en la misma sentencia if; t*en unindolas por ?2 logicos ^^! en perl# El ?2 significa 'ue alguna de las compro+aciones tienen 'ue ser verdad! para 'ue toda la sentencia sea cierta# $n e,emplo de compro+ar si tres varia+les no est(n vacias podr-a ser este)
if ::GinHInombreIJ e@ ,,= VV :GinHIemai&IJ e@ ,,= VV :GinHIcomentariosIJ e@ ,,== H 5 a&g.n cam(o estA en b&anco? de/o&/er mensa;e de error 5 sa&imos a& fina& de& scri(t a%ora? tenemos .n error e#itB J

De nuevo *e omitido! el codigo del mensa,e de error! 0a 'ue es sencillo construir un pe'ueIa ta+la con los codigos para devolver un c digo de error 8til para el usuario#
1=

Javier Prez Delgado

Tutorial de CGI

El c digo 'ue *e elegido para *acerlo aparece m(s tarde en el c digo final de guest+oo[#pl# &a 8ltima verificaci n 'ue necesitamos realizar es compro+ar 'ue la direcci n e%ail del usuario contiene un signo (W)# &o realizaremos f(cilmente con las potentes expresiones regulares 'ue el perl proporciona# $na expresion regular sencilla para c*e'uear esto ser-a /EwW<EwW/# 4implemente descri+e una situaci n donde una pala+ra aparece delante 0 detras de un s-m+olo W# &as expresiones regulares son una *erramienta extremadamente potente! pero no entran dentro del dominio de esta lecci n# Para llevar a ca+o la compro+aci n de 'ue la expresi n se cumple! simplemente comparamos# 7uncionar( como las comparaciones normales! pero usando el s-m+olo E+XG para igualdad 0 el s-m+olo E6XG para desigualdad# &a expresi n regular podr-a codificarse as-)
if :GinHIemai&IJ 6X /EwW<EwW/= H 5 !a e#(resiOn reg.&ar no es ig.a&? de/o&/er mensa;e de error$ J

De nuevo! *e omitido el mensa,e de error para este c digo# =# 3*ora compro+aremos la existencia de nuestro arc*ivo de +lo'ueo# 4i existe! nos detendremos por un segundo para un segundo intento# 4i no existe de+eremos crearlo! +lo'ueando de este modo el arc*ivo# Para *acerlo necesitaremos un +ucle continuo so+re una sentencia if-t%en-e&se 'ue comprue+e la existencia del arc*ivo! 0 'ue terminar( cuando *a0amos aIadido la entrada# Para el +ucle en perl usaremos la sentencia w%i&e# Esta sentencia e,ecuta repetidamente lo 'ue est( entre llaves *asta 'ue la condici n entre parntesis es falsa# $n e,emplo para clarificarlo)
w%i&e :condiciOn= H 5 Codigo a e;ec.tar mientras &a condiciOn sea cierta J

&as condiciones son del mismo tipo de las 'ue pondr-amos en una sentencia if-t%en# 9amos a usar de *ec*o una sentencia if;t*en con la clausula else en este +ucle# Como 0a sa+emos las sentencias if-t%en-e&se e,ecuta el t%en cuando la condici n es cierta 0 el e&se cuando es falsa#

if :condiciOn= H 5 COdigo a e;ec.tar si &a condiciOn es CIE TA J e&se H 5 COdigo a e;ec.tar si &a condiciOn es FA!SA J

Para compro+ar la exiastencia de un arc*ivo! usaremos el operador E-eG del nom+re del arc*ivo# <o se de+e olvidar 'ue el arc*ivo de +lo'ueo de+e estar en un lugar donde el *ttpd pueda escri+ir# En este caso lo colocaremos en el directorio
1D

Javier Prez Delgado

Tutorial de CGI

.sers/;(ere'/www/t.tor/# 4i el fic*ero existe! nos dentendremos durante un segundo! 0 lo volveremos a intentar# El lengua,e perl tiene un comando de espera con la forma)
s&ee(:5 seg.ndos=$

3'u- tenemos como de+emos realizar el c*e'ueo! con el comando de espera# Todo ello 'ueda incluido en un +ucle @*ile 'ue comprue+a 'ue la varia+le 'uitar vale 1 antes de salir#
G@.itar + 2B w%i&e :G@.itar 6+ M= H if :-e ,/.sers/;(ere'/www/t.tor/$g.est&ocL,= H 5 E& arc%i/o e#iste$ Es(eraremos .n seg.ndo s&ee(:M=B J e&se H 5 E& arc%i/o no e#iste? %aremos e& traba;o (ara a>adir &a entrada$ 5 A@.K deberemos dar a G@.itar /a&or M$ J J

Para crear el arc*ivo de +lo'ueo! simplemente de+eremos a+rir 0 cerrar el arc*ivo# 3s- crearemos un arc*ivo de K +0tes de longitud! 'ue servir( en nuestro c*e'ueo! 0 +lo'uear( otros procesos 'ue la gente pueda realizar en ese momento! *asta 'ue este *a0a aca+ado# Para ello esaremos un trozo de c digo 'ue a'u- se detalla)
o(en:!-CY?,0/.sers/;(ere'/www/t.tor//$g.est&ocL,=B c&ose !-CYB

D# 3*ora tnemos un +lo'ueador del fic*ero# 3*ora de+eremos a+rir 0 leer todos los contenisdos del g.estbooL$%tm&# Esto se *ace f(cilmente a+riendo el arc*ivo para lectura# En el comando open antes empleado usaremos el s-m+olo (Y) donde antes usamos (VV)# El resultado ser()
o(en:FI!EHAN9!E?,*nombrefic%ero,=B

El c digo ser())
o(en:G4?,*.sers/;(ere'/www/t.tor/g.estbooL$%tm&,=B

&eer del fic*ero es igual de f(cil# Perl perimite usar el 7I&E"3<D&E entre los s-m+olos (YV) para sustituir a la pr xima l-nea del fic*ero# 3s- pues! podemos poner algo como esto)
G&inea + *G40B

3s- leeremos una l-nea del fic*ero apuntado por G/! 0 avanzar( el puntero a la siguiente l-nea autom(ticamente# Esto significa 'ue la siguiente sentencia como esta leer( la siguiente l-nea# Podremos leer el arc*ivo entero en un +ucle! saliendo solo cuando no 'uede nada m(s!# Pero *a0 un modo m(s f(cil! podemos usar un vector# $n vector es una varia+le! con muc*a informaci n 'ue puede ser accedida individualmente# Aa *emos usado arra0s asociativos en la construcci n GinHI/ariab&eIJ# 2ecuerda 'ue se tiene el elemento eti'uetado como varia+le en el vector asociativo Gin# $saremos un vector ordenado numericamente# Esto significa 'ue la informaci n es almacenada en el vector
1J

Javier Prez Delgado

Tutorial de CGI

en el orden en la 'ue la ponemos! 0 podemos referenciar el elemento n;simo elemento aIadido! donde n es un n8mero cual'uiera# Estos vectores son referenciados con el signo W! 0 se usan de manera similar a los vectores asociativos cuando 'ueremos recuperar un solo elemento de l# El siguiente e,emplo lo explica)
<(e(e G(e(ePZQ G(e(eP2Q 5 Este es e& /ector (e(e entero? con todos s.s e&ementos 5 E& e& @.into e&emento de& /ector (e(e$ Notar @.e 5 se em(ie'a a contar desde 2? y @.e (or tanto) 5 es e& (rimer e&emento de& /ector$ :Ig.a& @.e en e& &eng.a;e C=

Perl proporciona un modo r(pido para llenar un vector con el contenido de un arc*ivo# Podemos usar la sentencia </ector + *FI!EHAN9!E0# 4e leer( cada linea del fic*ero apuntado por 7I&E"3<D&E! 0 seran colocados secuencialmente en el vector# Para leer el li+ro de visitas entero! de+eremos usar)
<&ineas + *G40B

<o de+emos olvidarnos de cerrar el fic*ero)


c&ose G4B

J# 9aciar el arc*ivo es mu0 sencillo# 4implemente de+emos rea+rirlo para escritura sin aIadir# Esto significa usar un EVG en vez de dos# $na vez *ec*o esto de+emos imprimir cada l-nea del fic*ero! sustitu0endo lo 'ue el usuario escri+i ,usto delante del marcador# Para llevar a ca+o la sustituci n usaremos la funci n s/o&d(attern/new(attern/! 'ue reemplaza el patr n antiguo con el nuevo# &a +uena noticia es 'ue modemos usar metacaracteres como En para reemplazar varias l-neas# Para 'ue esto afecte a una varia+le 'ue contiene una cadena usaremos un operador# &a sentencia 'uedar( as-)
G&inea +X s/o&d(attern/new(attern/

2ealmente *aremos una sustituci n en los comentarios! para convertir las nuevas l-neas en comandos Y/2V! de manera 'ue las l-neas 'ueden tal 0 como el visitante las escri+i # Para *acerlo pondremos)
GinHIcomentariosIJ +X s/En/*4 0En/goB

&a g 'ue va detr(s del patr n significa 'ue se *ar( esto para cada l-nea en la varia+le! la o significa compilar esta expresi n regular de manea 'ue concuerde m(s r(pido# Es +ueno *acerlo# Para realizar la sustituci n 0 aIadir los comentarios del usuario para cada l-nea del vector! usaremos uin +ucle foreac%# Esto significa para cada elemento de la lista! coloca el elemento en la varia+le>de>+ucle! 0 e,ecuta las sentencias 'ue est(n entre las llaves (\])# Esto ser-a)
foreac% G/ariab&e[de[b.c&e :&ista= H 5cosas a %acer J

Bueremos insertar el nom+re de la persona con su direcci n e;%ail entre parntesis! seguido de sus comentarios# Esto lo incluiremos en un parrafo "T%&!
1Q

Javier Prez Delgado

Tutorial de CGI

seguido de un comando Y"2V# <o tenemos 'ue olvidarnos de incluir un nuevo marcador YZ;;I<4E2T32 3B$XV# &o pondremos primero as- las nuevas entradas ser(n aIadidas al principio de la p(gina# %i codigo ser()
o(en:G4?,0/.sers/;(ere'/www/t.tor/g.estbooL$%tm&,=B foreac% G&inea :<&ineas= H G&inea+X s/*6--INSE TA A\"]--0/*6--INSE TA A\"]--0En*P0Nombre) GinHInombreIJ :GinHIemai&IJ=*4 0EnComentarios)*4 0EnGinHIcomentariosIJ*E/P0En*H 0En/oB (rint G4 G&ineaB J c&ose G4B

Q# 3*ora 'ue *emos reescrito el arc*ivo! de+emos des+lo'uearlo! +orrando el arc*ivo $g.est&ocL# Es sencillo! 0a 'ue perl tiene un +uncion +orrar)
.n&inL:&ista of fic%eros=B

3s- tendremos 'ue poner) .n&inL:,/.sers/;(ere'/www/t.tor/$g.est&ocL,=B T# El ultimo paso es apuntar a mi p(gina de agradecimiento# A poner la varia+le G@.itar + MB# "TTP nos permite *acer esto f(cilmente con la directiva de localizaci n# 4implemente devolvemos la l-nea)
!ocation) .r& Instead of) Content-Ty(e) te#t/%tm&

Esto lo resolvemos con la siguiente sentencia (rint)


(rint ,!ocation) %tt()//www$ct/$es/.sers/;(ere'/www/t.tor/agradecimiento$%tm&EnEn,B

&a nueva segunda l-nea es significativa# &os c digos de retorno %ime! de los cuales la localizaci n es uno de ellos! re'uiere dos nuevas lineas siguindolo para trazar el fin del c digo de retorno# ?lvidar la nueva segunda l-nea provocar( un daIo irrecupera+le# Poner la varia+le E'uitarG a 1 es trivial)
G@.itar + MB

El c digo final para el arc*ivo guest+oo[#pl ser()


56/.sr/&oca&/bin/(er& 5 Por 7a/ier P8re' 9e&gado :;(ere'<ct/$es= 1-N-N1 5 5 g.estbooL$(&

1T

Javier Prez Delgado 5 Procesa &as entradas a .n &ibro de firmas 5 5"saremos &a &ibrerKa cgi-&ib$(& (ara mane;ar &a entrada (.s%:<INC?,/(/www/%tt(d/cgi-bin,=B re@.ire:,cgi-&ib$(&,=B C eadParseB

Tutorial de CGI

if ::GinHInombreIJ e@ ,,= VV :GinHIemai&IJ e@ ,,= VV :GinHIcomentariosIJ e@ ,,== H 5 a&g^n cam(o en b&anco? de/o&/er mensa;e de error (rint CPrintHeaderB (rint ,*HTD!0En,B (rint ,*HEA90En,B (rint ,*TIT!E0Densa;e de error*/TIT!E0En,B (rint ,*/HEA90En,B (rint ,*4-9F0En,B (rint ,En,B (rint ,*HM0Ha oc.rrido .n error*/HM0En,B (rint ,En,B (rint ,*P0No %as com(&etado todos &os cam(os Por fa/or /.e&/e a intentar&o$*/P0En,B (rint ,*/4-9F0En,B (rint ,*/HTD!0En,B 5 &&amda (ara sa&ir de& scri(t$ Tenemos .n error e#itB J if :GinHIemai&IJ 6X /EwW<EwW/= H 5 No es ig.a& a &a e#(resiOn reg.&ar$ En/iar mensa;e de error (rint CPrintHeaderB (rint ,*HTD!0En,B (rint ,*HEA90En,B (rint ,*TIT!E0Densa;e de error*/TIT!E0En,B (rint ,*/HEA90En,B (rint ,*4-9F0En,B (rint ,En,B (rint ,*HM0Ha oc.rrido .n error*/HM0En,B (rint ,En,B (rint ,*P0T. direcciOn emai& no contiene .na <$*/P0En,B (rint ,*/4-9F0En,B (rint ,*/HTD!0En,B 5 &&amada (ara sa&ir a%ora de& scri(t? tenemos .n error e#itB J G@.itar + 2B w%i&e :G@.itar 6+ M= H if :-e ,/.sers/;(ere'/www/t.tor/$g.est&ocL,= H 5 E& fic%ero e#iste? es(eramos .n momento s&ee(:M=B J e&se H 5 Creamos e& fic%ero de b&o@.eo? de manera @.e e& &ibro de firmas @.eda b&o@.eado$ o(en:!-CY?,0/.sers/;(ere'/www/t.tor/$g.est&ocL,=B c&ose !-CYB 5 Abrimos y &eemos e& antig.o &ibo de firmas 5 Nota) Crear .na co(ia de seg.ridad no serKa .na ma&a idea $$$ o(en:G4?,*/.sers/;(ere'/www/t.tor/g.estbooL$%tm&,=B <&ineas + *G40B

1U

Javier Prez Delgado c&ose G4B 5 Pre(aramos &os comentarios (ara %tm& GinHIcomentariosIJ +X s/En/*4 0En/goB

Tutorial de CGI

5 _aciamos e& &ibro de firmas antig.o? y &o /o&/emos a im(rimir? a>adiendo &a n.e/a entrada o(en:G4?,0/.sers/;(ere'/www/t.tor/g.estbooL$%tm&,=B foreac% G&inea :<&ineas= H G&inea +X s/*6--INSE TA A\"]--0/*6--INSE TA A\"]--0En*P0Nombre) GinHInombreIJ :GinHIemai&IJ=*4 0EnComentarios)*4 0EnGinHIcomentariosIJ*E/P0En*H 0En/oB (rint G4 G&ineaB J c&ose G4B 5 desb&o@.ear e& arc%i/o .n&inL:,/.sers/;(ere'/www/t.tor/$g.est&ocL,=B 5 9e/o&/er e& n.e/o &ibro de firmas? y (oner G@.itar + M (rint ,!ocation) %tt()//www$ct/$es/.sers/;(ere'/www/t.tor/t%anLs$%tm&EnEn,B G@.itar + MB J

<ota so+re el +lo'ueo de arc*ivos) El mecanismo de +lo'ueo de arc*ivos usado arri+a! no es perfecto 0a 'ue re'uiere varios pasos para +lo'uear un arc*ivo# Por ello es posi+le o+tener un +lo'ueo o des+lo'ueo falso! aun'ue es altamanete impro+a+le# $na implementaci n me,ot usara el sistema de fic*eros nativo +lo'ueando! vinculando! o alg8n otro mtodo at mico# Desconozco si perl simula el +lo'ueo en sistemas 'ue no implementan el +lo'ueo de forma nativa# $n mtodo usando v-nculos sin comentar ser-a)
G@.it + 2B w%i&e :G@.it 6+ M= H /.sers/;(ere'/www/t.tor/g.estbooL$%tm& if :&inL:/.sers/;(ere'/www/t.tor/g.estbooL$%tm&?/.sers/;(ere'/www/t.tor/$g.est&ocL== H 5 Arc%i/o b&o@.eado? nos detenemos .n momento s&ee(:M=B J e&se H 5 Tenemos .n b&o@.eo? %acemos &o @.e tengamos @.e %acer .n&inL:,/.sers/;(ere'/www/t.tor/$g.est&ocL,=B J J

+CRI!T+ C,I QUE EN'3(N CORREO


En este apartado crearemos un script CGI 'ue env-e correo! 0 devolvera una p(gina 'ue indi'ue 'ue el correo *a sido enviado# 4in em+argo! los conceptos ser(n +astante geneales para permitir 'ue el script pueda ser adaptado a cual'uier pro0ecto donde sea necesario envi(r un correo desde un script# Tam+in veremos +revemente como examinar las areas de texto l-nea por l-nea#

1H

Javier Prez Delgado

Tutorial de CGI

Como siempre! cuando empezamos! necesitaremos un formulario#


*69-CTFPE HTD! P"4!IC ,-//IETF//9T9 HTD!//EN,0 *%tm&0 *6--7a/ier P8re' 9e&gado :;(ere'<ct/$es= A&& ig%ts eser/ed --0 *%ead0 *&inL re/+made %ref+,mai&to);(ere'<ct/$es,0 *tit&e0En/iar correo desde .n scri(t CGI*/tit&e0 */%ead0 *body0 *P0Este form.&ario encKa correo a &a direcciOn de &a (ersona mostrada$*/P0 *form met%od+,P-ST, action+,%tt()//www$ct/$es/"SE S/cgi-bin/mai&$(&,0 *P0T. direcciOn) *INP"T NADE+,9e, SI`E+R10*/P0 *P0T. " !) *INP"T NADE+,#.r&, SI`E+R10*/P0 *P0S.b;ect) *INP"T NADE+,s.b;ect, SI`E+Z20*/P0 *P0Densa;e)*/P0 *P0*TEaTA EA name+,body, rows+M2 co&s+120*/TEaTA EA0*/P0 *P0*in(.t ty(e+,s.bmit, /a&.e+,En/iar mansa;e,0 *in(.t ty(e+,reset, /a&.e+,4orrar todo,0*/P0 */F- D0 */P0 */body0 */%tm&0

3*ora pasaremos al script# Como siempre de+er( empezar con una llamada al perl! algunos comentarios 0 una llamada a la rutina 2eadParse! en la li+rer-a cgi-&ib$(&# Tam+in *aremos verificaciones de 'ue el cuerpo del mensa,e no est( vac-o! 0 de 'ue la direcci n contiene una arro+a (W)# Aa sa+emos *acerlo! por 'ue 0a lo realizamos en el anterior apartado# ?tra validaci n ser( para compro+ar 'ue de pasan argumentos! lo pondremos por'ue la gente tiene tendencia a llamar a los scripts de correo sin argumentos (eg) no desde un formulario)! no entiendo por 'u# Para compro+ar 'ue no *a0 argumentos! simplemente examinaremos si el vector bin 'ue la li+rer-a cgi-&ib$(& nos devuelve tiene alguna tecla# 2ecuerda! 'ue ning8n argumento! significa 'ue no nos *an pasado nada! sin em+argo! alguien puede pasar los argumentos en +lanco! de a'u- las dos compro+aciones# &a manera de compro+ar los valores de las teclas del vector es usar la funci n Leys:=# Esta funci n espera un arra0

:K

Javier Prez Delgado

Tutorial de CGI

asociativo como argumento# 4implemante compro+aremos 'ue devuelve algo! imprimiendo un mensa,e de error si no *a0 teclas# El c digo pude ser este)
if :6Leys:bin== H 5 nig.na tec&a %a sido (asada? im(rimir mensa;e de error? y si es a(ro(iado sa&ir$ J

Date cuenta de 'ue el signo EZG al principio de la llamada a Leys:=! significa EnoG o negaci n# Buiere decir 'ue si Leys:= no devuelve nada (falso)! sera negado para 'ue sea cierto 0 el if se e,ecute# 3*ora 'ue *emos validado las entradas! 0 se pueden realizar m(s compro+aciones! necesitaremos enviar la carta# Para ello necesitaremos un programa 'ue acepte una carta del stdin# &uego usaremos sendmai& en el e,emplo# 4i no est(s en un entorno $nix! necesitar(s otro programa apropiado para *acerlo# Como no conozco otro tipo de sistemas! no puedo *acer ninguna recomendaci n# $sar este programa ser( similar a escri+ir en un fic*ero# <ecesitamos a+rir el programa para aceptar la entrada! escri+ir al FI!EHAN9!E# 3+rir un programa 'ue espera entradas por el stdin es +astante f(cil em Perl# 3dem(s! es mu0 f(cil pasar el argumento de la l-nea de comandos# En este e,emplo! a+riremos sendmai&! 0 diremos 'ue +us'ue en la carta la direcci n de destino#
o(en:DAI!?,V/.sr/&ib/sendmai& -t,=B

Como se puede o+servar! es igual 'ue una llamada a fic*ero! pero los s-m+olos EVG o EYG *an sido sustituidos por un E^G (tu+er-a)# Esto indica 'ue lo 'ue *a0 detr(s de la tu+er-a es un e,ecuta+le! 0 'ue lo 'ue imprimamos en este FI!EHAN9!E se de+er( pasar como entrada a el programa e,ecuta+le# <ota) <o *e compro+ado si la operaci n anterior termin con xito! pero de+er-amos *acerlo# &a manera m(s sencilla de *acerlo! es apo0arnos en 'ue el comando o(en devuelve tr.e cuando *a tenido xito# 4olo de+emos *acer un - entre el comando o(en 0 otro comando conociendo 'ue ese comando ser( e,ecutado si el open falla# El e,emplo de a+a,o realiza un - con el comando die# Este comando imprime un mensa,e de error 0 sale del programa#
o(en:DAI!?,V/.sr/&ib/sendmai& -t,= VV die ,!a &&amada a sendmai& %a fa&&ado,B

El imprimir la carta funciona como experamos# 2ecuerda! sin em+argo! 'ue estamos imprimiendo un trozo de e;%ail! por lo 'ue de+eremos poner las ca+eceras adecuadas! un l-nea en +lanco 0 el cuerpo del mensage# Puedes ec*ar un vistazo a un e;%ail 'ue *a0as reci+ido 0 compro+ar las ca+eceras# Decri+ir a+a,o lo m(s importante# &os comentarios ser(n de a0uda#
5 Esta es &a &Knea c(arad$ Si tenemos e& nombre y &a direcciOn? escribiremos 5 (rimero e& nombre y &.rgo &a direcciOn entre *0 (rint DAI! ,To) GinHI9eIJEn,B 5 Esta es &a &inea c9ed$ Pondremos e& mismo nombre en &a &Knea c9ed y en &a c(arad 5 ec.erda @.e no %ay seg.ridad com(robando e& emai&? (or e&&o estas &Kneas 5 (.eden ser fa&sificadas$ N- FA!SIFI\"ES E! EDAI!? no es di/ertido y en a&g.nos &.gares 5 es .n de&ito$ (rint DAI! ,From) GinH9eJEn,B

:1

Javier Prez Delgado 5 Esta es &a &inea ccontestar ad$ Esta &Knea se inc&.ye debido a @.e a&g.nos (rogramas 5 son bastante tonotos y no siem(re res(onden a &a &Knea c9ed$ 5 A& menos res(etarAn esta &Knea$ (rint DAI! , e(&y-To) GinH9eJEn,B

Tutorial de CGI

5 !o sig.iente son cabeceras a$ Son creadas (or e& .s.ario y (.eden contener 5 todo &o @.e desees$ Inc&.yo .na &inea de descri(ciOn 5 tambien %e escrito &as &Kneas ED-TE[H-ST? ED-TE[A99 ? y ED-TE["SE (ara 5 ay.dar a& seg.imiento :traLing= de &a carta$ 5 So&o escribo &a &Knea a-" ! si e& .s.ario %a dado .na .r&$ Este ti(o 5 de com(robaciOn (robab&emente %ec%a tambi8n en e& a- emote-Host y a- emote-"ser (rint DAI! ,a-mai&er) Dai&$(&? a cgi-bin scri(t at %tt()//www$ct/$es/.sers/;(ere'/www/t.tor/ /inde#$%tm&En,B (rint DAI! ,a- emote-Host) GEN_HI ED-TE[H-STIJ :GEN_HI ED-TE[A99 IJ=En,B (rint DAI! ,a- emote-"ser) GEN_HI ED-TE["SE IJEn,B (rint DAI! ,a-disc&aimer) !a &Knea 9e) (.ede estar fa&sificada ,B (rint DAI! ,No confiar en .n M22b sobre &a integridad de este mai&$ ,B (rint DAI! ,No somos res(onsab&es de este correo de ning.na maneraEn,B if :GinH#.r&J ne ,,= H (rint DAI! ,a-" !) GinH#.r&JEn,B J 5 Fina&mente escribimos&y we (rint t%e famo.s s.b;ect &ine$ I %a/e a((ended a string 5 identifying t%is as WWW generated emai&? t%is is far from a re@.irement$ 5 Notice t%e second new &ine$ T%is is t%e b&anL &ine t%at wi&& se(arate t%e 5 %eaders from t%e body$ A&& mai& m.st %a/e t%is &ine$ (rint DAI! ,S.b;ect) GinHs.b;ectJ :WWW generated emai&=EnEn,B 5 Now we are going to (rint t%e body$ 4eca.se it was in(.t into a TEaTA EA 5 fie&d? it %as new &ines after eac% &ine$ We can ;.st (rint it &iLe any ot%er 5 fie&d? Lnowing t%at t%e new &ines wi&& e#(and it (ro(er&y$ (rint DAI! GinHIbodyIJB

4olo 'uedan dos cosas# Primero de+emos cerrar la conexi n con sendmai&# 4egundo de+emos imprimir una p(gina enseIando al usuario la carta 'ue env-a# Para cerrar la conexi n! usaremos el comando c&ose! ,usto como en cual'uier otro mane,ador)
c&ose:DAI!=B

Imprimir la respuesta no es diferente a las otras p(ginas generadas din(micamente 'ue 0a *emos creado anteriormente# De+eremnos dividir el campo TEaTA EA en l-neas colocando un *4 0 al final de cada una# Esto se *ace principalmente para demostrar como se divide un campo de texto# 2ecuerda sin em+argo 'ue %tm& no respeta las nuevas l-neas# Con ello se consigue el poder *acer los parrafos de manera m(s clara! pero el +eneficio de *acerlo es cuestiona+le# El valor del campo body (cuerpo del mensa,e)! no es m(s 'ue un con,unto de frases separadas con un retorno de carro# Podemos usar la funci n split() para separarlas# Esta funci n necesita dos par(metros) la cadena o car(cter para separar 0 la varia+le a separar! 0 retorna un arra0 con los elementos separados# $saremos s(&it en un +ucle foreac%)
foreac% G& :s(&it:IEnI?GinHIbodyIJ== H (rint ,G&*4 0En,B J

::

Javier Prez Delgado

Tutorial de CGI

Como se puede ver separa la varia+le GinHIbodyIJ en partes cada nueva l-nea! 0 la imprime seguida de un *4 0$

E+CRI)IENDO +CRI!T+ C,I +E,URO+


4iempre 'ue un programa interact8a con un cliente por red! existe la posi+ilidad de 'ue el cliente atc'ue al programa para conseguir un acceso# El script m(s inocente puede ser mu0 peligroso para la integridad de tu sistema# Teniendo eso en cuenta! me gustar-a comentar unos pe'ueIos conse,os para conseguir 'ue tu programa no sea atacado#

Cuidado con la sentencia eval


&engua,es como el Per& 0 el 4o.rne s%e&& tienen un comando e/a& 'ue permiten construir una cadena 0 de,ar al intrprete 'ue la e,ecute# Esto puede resultar peligroso# ?+serva la siguiente sentencia en 4o.rne s%e&&)
e/a& eec%o G\"E F[ST ING V awL I4EGINH S+,C,J H(rintf ,\S[bsEn,?GMJI e

:=

Javier Prez Delgado

Tutorial de CGI

Esta sentencia coge la cadena de entrada 0 la convierte en un con,unto de comandos de declaraci n de varia+les# Desafortunadamente este script puede ser atacado mandando una cadena de entrada 'ue empiece por E_G#

No conf4es en $ue el cliente %aga algo


$n cliente correcto evitar( todos los caracteres 'ue tienen un significado especial para el 4o.rne S%e&& en una cadena de entrada! 0 'ue *ega 'ue tu scri(t malinterprete los caracteres# $n cliente malintencionado usar( esos caracteres para confundir a tu script 0 ganar acceso desautorizado#

Cuidado con popen() # system()


4i usas datos del cliente para construir una llamada a (o(en:= o system:=? asegurat de poner un +ac[slas* delante de cada car(cter 'ue tenga un significado especial para el 4o.rne S%e&& antes de llamar a la funci n# &o podr(s *acer con una sencilla funci n en C# 4i 'uieres m(s informaci n so+re la seguridad en el ...! consulta ... 4ecurit0 73B en %tt()//www-genome$wi$mit$ed./WWW/fa@s/www-sec.rity-fa@$%tm&#

:D

Вам также может понравиться