@eugeniabahit GLAMP HACKER Y PROGRAMADORA EXTREMA HACKER ESPECIALIZADA EN PROGRAMACIN EXTREMA E INGENIERA INVERSA DE CDIGO SOBRE GNU/LINUX, APACHE, MYSQL, PYTHON Y PHP. EUGENIABAHIT.COM DOCENTE E INSTRUCTORA DE TECNOLOGAS GLAMP CURSOS.EUGENIABAHIT.COM CURSOSDEPROGRAMACIONADISTANCIA.COM MIEMBRO DE LA FREE SOFTWARE FOUNDATION FSF.ORG, THE LINUX FOUNDATION LINUXFOUNDATION.ORG E INTEGRANTE DEL EQUIPO DE DEBIAN HACKERS DEBIANHACKERS.NET. CREADORA DE PYTHON-PRINTR, EUROPIO ENGINE, JACKTHESTRIPPER. VIM CONTRI- BUTOR. FUNDADORA DE HACKERS N' DEVELOPERS MAGAZINE Y RESPONSABLE EDITORIAL HASTA OCTUBRE '13. Buenos Aires, 5 de Noviembre de 2013 NDICE DE LA EDICIN NRO1 SHELL SCRIPTING : ANLISIS DE ARGUMENTOS ENVIADOS POR LNEA DE COMANDOS MEDIANTE PYTHON CON ARGPARSE.................................3 PROCESOS DE RAZONAMIENTO INVERSO : PATRN DE DISEO ADAPTER EN PYTHON Y PHP, LOS CMO Y LOS PARA QU..............................10 INGENIERA DE SOFTWARE : ARCHIVOS PRE Y POST INSTALACIN/DESINSTALACIN EN LOS PAQUETES DEBIAN......................................17 EUROPIO ENGINE LAB : FORMULARIOS WEB Y TABLAS HTML EN SOLO UNOS POCOS PASOS..............20 SEGURIDAD INFORMTICA : EMULACIN DE TOKENS DE SEGURIDAD TEMPORALES COMO MECANISMO DE VERIFICACIN EN EL REGISTRO DE USUARIOS.....26 The Original Hacker www.originalhacker.org 2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 3 SHELL SCRIPTING: ANLISIS DE ARGUMENTOS ENVIADOS POR LNEA DE COMANDOS MEDIANTE PYTHON CON ARGPARSE ARGPARSE ES UN MDULO DE LA LIBRERA ESTNDAR DE PYTHON, QUE REEMPLAZANDO A OPTPARSE DESDE LA VERSIN 2.7 DEL LENGUAJE, SE HA CONVERTIDO EN EL MDULO POR EXCELENCIA PARA ANALIZAR LOS ARGUMENTOS ENVIADOS A TRAVS DE LA LNEA DE COMANDOS. l mdulo argparse forma parte de la librera de mdulos estndar de Python y su finalidad es la de analizar los argumentos eniados al programa mediante lnea de comandos! facilitando las mismas funcionalidades "ue el obsoleto optparse pero incorporando ciertas caractersticas con las "ue #ste no contaba. $ %e trata de un mdulo muy simple de utilizar y no necesariamente ser implementado solo por especialistas en Python& tambi#n es una e'celente alternatia para crear de forma rpida un script principal (main) para cual"uier tipo de aplicacin de consola! incluso! a"uellas programadas con bash u otros lenguajes "ue no cuenten con tanta facilidad para! por ejemplo! el anlisis de argumentos y*o la generacin de ayudas en pantalla. +on solo agregar una lista de argumentos a ArgumentParser()! el mdulo se encargar de poner a disposicin del usuario de la aplicacin! los argumentos -h y --help y generar de forma automtica! te'tos de ayuda similares al siguiente& eugenia@cococha-gnucita:~/HDMagazine/12$ python newhost --help usage: ne!host "-h# "-$# -% D&MA'( "-a "A)'A* "A)'A* +++### "-l ",static-p.thon-php/## "-u 0*12(AM1# "-p PA3H# "-lp )&4PA3H# "--sen%-email# "-e 1MA')# Prepara el am5iente necesario para hospe%ar un nue$o %ominio en 05untu *er$er 12+67 )3* o $ersiones posteriores
optional arguments: -h, --help show this help message and exit -v, --version show program's version number and exit The Original Hacker www.originalhacker.org 2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 4 -% D&MA'(- --%omain D&MA'( (om5re %el %ominio a con8igurar -a "A)'A* "A)'A* +++##- --alias "A)'A* "A)'A* +++## Alias %e %ominio -l ",static-p.thon-php/#- --language ",static-p.thon-php/# )engua9e pre%etermina%o %el sitio :e5 -u 0*12(AM1- --user 0*12(AM1 0suario %el %ominio -p PA3H- --path PA3H Directorio ra;z %e archi$os :e5 -lp )&4PA3H- --log-path )&4PA3H Directorio en el <ue ser=n almacena%os los logs %e Apache --sen%-email *i se in%ica- en$iar= un e-mail con los %atos %el nue$o %ominio+ -e 1MA')- --email 1MA') >=li%o si --sen%-email se ha in%ica%o+ +omo se puede obserar en el blo"ue anterior! dos argumentos por defecto! son descriptos al comienzo& help y $ersion. ,mbos son facilitados por argparse para mostrar la ayuda y ersin del programa! respectiamente. -ncluso! la ayuda de uso ser mostrada si los argumentos recibidos no son los esperados& eugenia@cococha-gnucita:~/HDMagazine/12$ python newhost usage: ne!host "-h# "-$# -% D&MA'( "-a "A)'A* "A)'A* +++### "-l ",static-p.thon-php/## "-u 0*12(AM1# "-p PA3H# "-lp )&4PA3H# "--sen%-email# "-e 1MA')# ne!host: error: argument -%/--%omain is re<uire% .odo esto es lo "ue argparse pondr a disposicin del usuario! con unas pocas lneas de cdigo fuente. INTRODUCCIN Importacin e! mu!o" Para comenzar a utilizar argparse! bastar con importar la clase ArgumentParser()& 8rom argparse import ArgumentParser Construccin e un o#$eto Argument%arser" +onstruir un objeto ArgumentParser! es una forma de inicializar los datos principales de la aplicacin. $l m#todo constructor del objeto ,rgumentParser (funcin //init//)! si bien puede ser inocado sin argumentos! permite (entre otros)! los siguientes parmetros& prog por %e8ecto es el nom5re %el archi$o aun<ue en circunstancias mu. puntuales- po%r;a mo%i8icarse description una %escripci?n %el programa <ue ser= mostra%a al inicio %e la a.u%a epilog te@to <ue ser= mostra%o al 8inal %e la a.u%a The Original Hacker www.originalhacker.org 2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 5 version nAmero %e $ersi?n %el programa .odos estos parmetros son opcionales pero sin embargo! si se indicase el parmetro $ersion! automticamente dispondramos de la opcin -$ y $ersion& #!/usr/bin/env python 8rom argparse import ArgumentParser argp B ArgumentParser( $ersionBC1+6C- %escriptionBCDescripci?n 5re$e %el programaC- epilogBCDop.right 261E Autor 5a9o licencia 4P) $E+6C ) 0tros par&metros amitios por ArgumentParser.__init__() pueden erse en la siguiente 12L del manual oficial& http&**docs.python.org*3*library*argparse.html4argumentparser5objects AGREGANDO ARGUMENTOS CON ARGUMENTPARSER.ADD_ARGUMENT +uando se crea un objeto ArgumentParser- #ste dispone de un m#todo a%%Fargument() "ue como su nombre lo indica! tiene por finalidad agregar argumentos de a uno por ez. $ste m#todo! puede recibir como parmetro! un nombre de argumento o una lista de banderas (flags). Por ejemplo& argp+a%%Fargument(C%irectorioC- C-%C- C--%irectorioC) argp+a%%Fargument(C%ominioC) argp+a%%Fargument(C-lC) argp+a%%Fargument(C--listarC) argp+a%%Fargument(C-pC- C--printerC) ,dems del argumento en s mismo! a%%Fargument() puede recibir muchos otros parmetros. $ntre los ms frecuentes! podemos encontrar los siguientes& action 6escripcin& ,ccin "ue se deber realizar con el alor del argumento. 7alores posibles& store almacena el $alor (acci?n pre%etermina%a) storeFconst si el argumento es pasa%o- almacenar= el $alor %e8ini%o en el par=metro const ($er m=s a5a9o)+ 1s Atil cuan%o se re<uiere reci5ir un 8lag pero sin $alor asocia%o storeFtrue / storeF8alse 'gual <ue storeFconst pero no necesita %e8inir el $alor %e const The Original Hacker www.originalhacker.org 2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 6 .a <ue almacenar=n 3rue o Galse respecti$amente en caso <ue el argumento sea pasa%o appen% almacena los $alores %el argumento en una lista+ 1s Atil cuan%o un mismo argumento pue%e in%icarse $arias $eces con %i8erentes $alores Por e9emplo: --argumento $alor1 --argumento $alor2 generarar;a argumento B "C$alor1C- C$alor2C# appen%Fconst almacena el $alor %e const en una lista+ 1specialmente Atil cuan%o el $alor %e %i8erentes argumentos es una constante . se los necesita %e 8orma uni8ica%a ($er e9emplo para me9or comprensi?n)+ 2e<uiere <ue el par=metro %est ($er m=s a5a9o) posea el mismo $alor en los %i8erentes argumentos 7alor por defecto& store 0bligatorio& 80 $jemplo& argp+a%%Fargument(C--ta5leC- actionBCstoreC) --table foo genera: table = 'foo' argp+a%%Fargument(C--ta5leC- actionBCstoreFconstC- constBCusersC) --table genera: table = 'users' argp+a%%Fargument(C--ta5leC- actionBCappen%C) --table foo --table bar genera: table = ['foo', 'bar'] argp+a%%Fargument(C--phpC- %estBClengua9esC- actionBCappen%FconstC- constBCphpC) argp+a%%Fargument(C--p.thonC- %estBClengua9esC- actionBCappen%FconstC- constBCp.thonC) --php --python genera: lenguajes = ['php', 'python'] nargs 6escripcin& +antidad de alores "ue pueden recibirse para el argumento en cuestin. 7alores posibles& el literal de un entero (incluso cuando sea 9! retornar una lista)! o sino& H uno o ninguno I uno o m=s J cero o m=s 21MA'(D12 to%os los argumentos se recogen en una lista+ 1sto es especialmente Atil- cuan%o los coman%os reci5i%os se re<uieren pasar a otra aplicaci?n+ 7alor por defecto& uno solo 0bligatorio& 80 $jemplo& The Original Hacker www.originalhacker.org 2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 7 argp+a%%Fargument(C--ta5leC- nargsBCIC) argp+a%%Fargument(C--rangoC- nargsB2) e'au!t 6escripcin& 1n alor por defecto para el argumento. 7alores posibles& cual"uiera 7alor por defecto& ninguno 0bligatorio& 80 $jemplo& argp+a%%Fargument(C--hostC- %e8aultBClocalhostC) t(pe 6escripcin& $l tipo de datos 7alores posibles& str! int! etc. 7alor por defecto& 8one 0bligatorio& 80 $jemplo& argp+a%%Fargument(C-n- --nom5reC- t.peBstr) argp+a%%Fargument(C--e%a%C- t.peBint) choices 6escripcin& 1na lista de opciones con alores posibles 7alores posibles& una lista 7alor por defecto& 8one 0bligatorio& 80 $jemplo& argp+a%%Fargument(C-l- --languageC- choicesB"CphpC- C5ashC- Cru5.C#) re)uire 6escripcin& -ndica si el argumento es o no obligatorio 7alores posibles& 3rue Argumento o5ligatorio Galse Argumento no o5ligatorio 7alor por defecto& :alse 0bligatorio& 80 $jemplo& argp+a%%Fargument(C--o5ligatorioC- re<uire%B3rue) argp+a%%Fargument(C--opcionalC- re<uire%BGalse) he!p 6escripcin& .e'to a mostrar en la ayuda del argumento. 7alores posibles& cadena de te'to The Original Hacker www.originalhacker.org 2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 8 7alor por defecto& 8one 0bligatorio& 80 (aun"ue es muy recomendado indicarlo) $jemplo& argp+a%%Fargument(C--listC- helpBC2etorna la lista %e ta5las en la DKC) est 6escripcin& 8ombre "ue se utilizar para la ariable "ue almacenar el alor del argumento. 7alores posibles& string con nombre de ariable lido 7alor por defecto& el nombre argumento o flag 0bligatorio& 80 $jemplo& argp+a%%Fargument(C-pC- %estBCpathC) argp+a%%Fargument(C-hC- %estBChostnameC) GENERAR EL ANLISIS DE LOS ARGUMENTOS CON ARGUMENTPARSER.PARSE_ARGS :inalmente! se necesitar indicar a ArgumentParser "ue analice los argumentos& argumentos B argp+parseFargs() parseFargs retornar cada argumento indicado por lnea de comandos! seg;n su configuracin! como propiedades del objeto generado& argumentos B argp+parseFargs() suponiendo un argumento uyo destino sea llamado foo, obtendr!amos su valor on: print argumentos+8oo , continuacin! el cdigo "ue gener el te'to de ayuda del ejemplo al comienzo del artculo& #!/usr/bin/env python # -"- oding:utf-# -"- 8rom argparse import ArgumentParser argp B ArgumentParser( progBCne!hostC- %escriptionBLLLPrepara el am5iente necesario para hospe%ar un nue$o %ominio en 05untu *er$er 12+67 )3* o $ersiones posterioresLLL- epilogBCDop.right 261E 1ugenia Kahit - 4P) $E+6C- $ersionBC(e! :e5*ite Hosting 5eta 1+6C ) argp+a%%Fargument( C-%C- C--%omainC- actionBCstoreC- re<uire%B3rue- helpBC(om5re %el %ominio a con8igurarC- %estBC%omainC) The Original Hacker www.originalhacker.org 2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 9 argp+a%%Fargument( C-aC- C--aliasC- actionBCstoreC- re<uire%BGalse- nargsBCJC- helpBCAlias %e %ominioC- %estBCaliasC ) argp+a%%Fargument( C-lC- C--languageC- choicesB"CstaticC- Cp.thonC- CphpC#- actionBCstoreC- re<uire%BGalse- %e8aultBCstaticC- nargsBCHC- helpBC)engua9e pre%etermina%o %el sitio :e5C- %estBClanguageC ) argp+a%%Fargument( C-uC- C--userC- actionBCstoreC- %e8aultBC!!!-%ataC- re<uire%BGalse- helpBC0suario %el %ominioC- %estBCusernameC ) argp+a%%Fargument( C-pC- C--pathC- actionBCstoreC- %e8aultBC/sr$/!e5sites/C- re<uire%BGalse- helpBCDirectorio ra;z %e archi$os :e5C- %estBCpathC ) argp+a%%Fargument( C-lpC- C--log-pathC- actionBCstoreC- %e8aultBC/sr$/!e5sites/logs/C- re<uire%BGalse- helpBCDirectorio en el <ue ser=n almacena%os los logs %e ApacheC- %estBClogpathC ) argp+a%%Fargument( C--sen%-emailC- actionBCstoreFtrueC- re<uire%BGalse- helpBC*i se in%ica- en$iar= un e-mail con los %atos %el nue$o %ominio+C- %estBCsen%emailC ) argp+a%%Fargument( C-eC- C--emailC- actionBCstoreC- re<uire%BGalse- helpBC>=li%o si --sen%-email se ha in%ica%o+C- %estBCemailC ) args B argp+parseFargs() print $ars(args) # """"" $%& '()%*+ ,'-%./ .0/1+& """"" # ejeui2n del sript eugenia@cococha-gnucita:~/HDMagazine/12$ python newhost -v &e3 4eb,ite 1osting beta 567 eugenia@cococha-gnucita:~/HDMagazine/12$ python newhost -d eugeniabahit.com -a www.eugeniabahit.com -l php -u uanito 8'username': 'juanito', 'domain': 'eugeniabahit6om', 'language': 'php', 'sendemail': $alse, 'logpath': '/srv/3ebsites/logs/', 'alias': ['3336eugeniabahit6om'], 'path': '/srv/3ebsites/', 'email': &one9 The Original Hacker www.originalhacker.org 2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 10 PROCESOS DE RAZONAMIENTO INVERSO: PATRN DE DISEO ADAPTER EN PYTHON Y PHP, LOS CMO Y LOS PARA QU TIENES UN ENCHUFE DE TRES PATAS PERO UN TOMA CORRIENTE DE DOS. NECESITAS INSERTAR LA CLAVIJA EN EL TOMA SIN MODIFICAR NINGUNA DE LAS DOS. SOLUCIN: UTILIZAS UN ADAPTADOR. BIENVENIDAS/OS AL PATRN DE DISEO ADAPTER. ecesitaba un ejemplo sencillo "ue me permitiese demostrar isualmente! cmo funciona el patrn de dise<o ,dapter y el ejemplo del enchufe! me ino =como anillo al dedo. Pues no podra ser ms claro& es la imagen perfecta e ine"uoca para comprender este marailloso patrn de dise<o. 8 $n la programacin orientada a objetos! un patrn e ise*o representa la 'orma en !a cua! se puee reso!ver e! comportamiento e un o#$eto o !a re!acin entre e!!os y el patrn de dise<o Adapter (adaptador) resuele la necesidad de conectar dos (o ms) objetos entre s! dnde al menos uno de ellos necesitara ser modificado. Pero para poder e'plicarlo sin riesgo a confusiones! me oy a aler de un caso real. Para ello! les pido "ue imaginemos "ue tenemos un tpico objeto 1suario& # :a lase ;suario en .1. class 0suario , 8unction FFconstruct() , $this-MusuarioFi% B 6N $this-Mnom5re B CCN / / # :a lase ;suario en .ython class 0suario(o59ect): The Original Hacker www.originalhacker.org 2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 11 %e8 FFinitFF(sel8): sel8+usuarioFi% B 6 sel8+nom5re B CC > nos encontramos con "ue debemos implementar las siguientes +istorias e ,suario& +mo usuario puede eniar mensajes a otro usuario del sistema +mo usuario puedo er una lista de los mensajes "ue he recibido desde otros usuarios ?ablamos de un re"uerimiento tpico de una gran parte de las aplicaciones tanto @eb como de escritorio. Si simp!emente pens&ramos en -A./S pero N/ EN /B0E./S! nos encontraramos con una tabla de mensajes! con un campo remitente/id! otro destinatario/id! y otros ms destinados a almacenar la fecha! el asunto y el cuerpo del mensaje! por ejemplo. > lo anterior! arrojara como resultado una clase con propiedades simples y complicados y errados m#todos no estndar! "ue realicen consultas cruzadas en la base de datos& *1)1D3 mensa9e+mensa9eFi%- mensa9e+asunto- mensa9e+cuerpo- mensa9e+8echa- mensa9e+esta%o- usuario+nom5re A* remitente- usuario+nom5re A* %estinatario G2&M mensa9e '((12 O&'( usuario &( mensa9e+remitenteFi% B usuario+usuarioFi% &2 mensa9e+%estinatarioFi% B usuario+usuarioFi% etc+ > luego la clase Aensaje deriara del dise<o preio de la base de datos& class Mensa9e(o59ect): %e8 FFinitFF(sel8): sel8+mensa9eFi% B 6 sel8+asunto B CC # < sel8+remitenteFi% B 6 P 0suario+usuarioFi% sel8+%estinatarioFi% B 6 P tam5iQn ser;a 0suario+usuarioFi% Lo anterior! sera un ejemplo sobre cmo las Bmalas costumbresC nos llean a pensar en atos. Pero sin embargo! por1amos pensar estrictamente en o#$etos y en este caso! nos encontraramos con la siguiente definicin inicial del objeto mensaje& $l mensaje tiene 9 remitente $l mensaje tiene 9 destinatario D The Original Hacker www.originalhacker.org 2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 12 $sto! nos hara deducir! correctamente! "ue 2emitente y 6estinatario! seran dos tipos de objetos diferentes& # =n .1. class 2emitente , / class Destinatario , / # =n .ython class 2emitente(o59ect): pass class Destinatario(o59ect): pass > a la ez! Aensaje! tendra dos propiedades compuestas por los objetos 2emitente y 6estinatario respectiamente& # =n .1. class Mensa9e , 8unction FFconstruct(2emitente $rtteB(0))- Destinatario $%estB(0))) , # 666 $this-Mremitente B $rtteN $this-M%estinatario B $%estN # 666 / / # =n .ython class Mensa9e(o59ect): %e8 FFinitFF(sel8- remitenteB(one- %estinatarioB(one): # 666 sel8+remitente B compose(2emitente- remitente) sel8+%estinatario B compose(Destinatario- remitente) # notar >ue he utili?ado una funi2n llamada ompose@+bjeto-e>uerido, objetoAompositorB # uyo fin ser!a el de omponer a la propiedad # para mCs informai2n, se puede leer sobre el patr2n de diseDo ompuesto en .ython # en http://3336buboE6es/libros/F5GF##//eoria-sintatiogramatial-de-objetos %in embargo! no necesitamos si"uiera! analizar a los objetos 2emitente y 6estinatario en profundidad! para saber "ue en realidad estamos hablando de objetos 1suario& # =n .1. class 2emitente e@ten%s 0suario , / class Destinatario e@ten%s 0suario , / # =n .ython class 2emitente(0suario): pass The Original Hacker www.originalhacker.org 2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 13 class Destinatario(0suario): pass ?asta a"u! nada parece complicado. %in embargo! los objetos 2emitente! 6estinatario y 1suario! son e'actamente iguales. $ntonces 2por )u3 no componer 4ensa$e irectamente con e! o#$eto ,suario5 La razn es sencilla y es "ue en la orientacin objetos bien implementada! !as propieaes compuestas !!evan e! nom#re e! o#$eto )ue !as compone y eso permite& 0btener objetos ms reales! relacionalmente lgicos y estructuralmente coherentesE Lograr una mayor legibilidad y facilidad de comprensinE 8o ensuciar los m#todos constructores con funciones destinadas a manejar el tipo de datos de las propiedadesE 1tilizar mapeadores relacionales de objetos (02A) basados en objetos reales y no en BparchesC de datos colocados a los objetos. $ntonces! repasando! hasta a"u tendramos los siguientes objetos y relaciones& -iagrama ,46 realizado con 6ia https&**projects.gnome.org*dia* (%oftware Libre) Pero lo cierto es! "ue tanto 2emitente como 6estinatario son o#$etos simu!aos! creados para satisfacer las e'igencias del objeto Aensaje. > en realidad! cuando el m#todo get() de Aensaje sea inocado y #ste! intente componer sus dos propiedades (Mensa9e+remitente y Mensa9e+%estinatario)! el m#todo get() real al "ue debera inocarse! tendra "ue ser el m#todo get() de 1suario! ya "ue a decir erdad! es el erdadero compositor. Mensaje debera recurrir al mtodo get() de Usuario que es el verdadero compositor The Original Hacker www.originalhacker.org 2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 14 ,"u es dnde la BadaptacinC real sale a la luz. 2emitente y 6estinatario al fin debern BadaptarC las BclaijasC de 0suario para ser insertadas en el Btoma corrienteC de Mensa9e+ $s entonces cuando la funcin transformadora de ambos objetos! pasa a ser la adaptacin del m#todo get() de 0suario& Cuando Mensa9e llame al mtodo get de 2emitente y Destinatario- en realidad deber ser el mtodo get de 0suario quien deba ejecutarse y luego, transformar a 0suario en un 2emitente y en un Destinatario respectivamente. 2emitente y Destinatario! debern entonces! sobrescribir el m#todo get heredado de 0suario! a fin de "ue 0suario+get() sea llamado! cada ez "ue 2emitente+get() y Destinatario+get() sean inocados& # =n .1. 8unction get() , $usuario B ne! 0suario()N $usuario-MusuarioFi% B $this-MusuarioFi%N $usuario-Mget()N 8oreach($usuario as $propert.BM$$alue) , $this-M$propert. B $$alueN / / # =n .ython %e8 get(sel8): usuario B 0suario() usuario+usuarioFi% B sel8+usuarioFi% usuario+get() 8or propert.- $alue in $ars(usuario)+iteritems(): setattr(sel8- propert.- $alue) -ncluyendo esta sobre5escritura del m#todo get() de 1suario! 2emitente y 6estinatario se transforman en dos adaptadores. > sera genial! si no e'istiese la redundancia! pues el m#todo get() se sobrescribe igual en 2emitente "ue en 6estinatario y uno de los principios del 2efactoring indica "ue& Si dos clases que heredan de la misma clase tienen mtodos idnticos, se extrae el mtodo repetido y se lo lleva a la clase Madre Pero F"u# sucedera si este m#todo fuese lleado a la clase madreG +laramente! estaramos eliminando el erdadero m#todo get() de 1suario. $ntonces! la solucin es e'traer el m#todo hacia una nuea clase y hacer heredar a 2emitente y destinatario de esta nuea clase. > #sta! a la ez! sera "uien herede de 1suario& # =n .1. class !suarioAdapter e@ten%s !suario , The Original Hacker www.originalhacker.org 2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 15 8unction get() , $usuario B ne! 0suario()N $usuario-MusuarioFi% B $this-MusuarioFi%N $usuario-Mget()N 8oreach($usuario as $propert.BM$$alue) , $this-M$propert. B $$alueN / / / class 2emitente e@ten%s !suarioAdapter , / class Destinatario e@ten%s !suarioAdapter , / # =n .ython class !suarioAdapter(!suario): %e8 get(sel8): usuario B 0suario() usuario+usuarioFi% B sel8+usuarioFi% usuario+get() 8or propert.- $alue in $ars(usuario)+iteritems(): setattr(sel8- propert.- $alue) class 2emitente(!suarioAdapter): pass class Destinatario(!suarioAdapter): pass AVISO: notar que en los ejemplos no se ha utilizado el mtodo constructor en las clases, no porque no deba utilizarse (al contrario), sino porque no es de relevancia para el ejemplo. :inalmente! la relacin "uedara como la siguiente& The Original Hacker www.originalhacker.org 2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 16 PATRN DE DISEO ADAPTER EN EUROPIO ENGINE %i ests utilizando Europio Engine (www.europio.org)! habr "ue tener en cuenta "ue al momento de inocar al m#todo get() de Mensa9e- cuando #ste recurra al get() de 2emitente y Destinatario para componer sus dos propiedades homnimas! el 02A considerar las propiedades remitente/id y destinatario/id! como las propiedades identificadoras de 2emitente y 6estinatario respectiamente. Lo propio suceder con la propiedad id de 1suario,dapter. Por lo tanto! habr "ue agregar a 2emitente- Destinatario y 0suarioA%apter! sus respectias propiedades -6 y encargarse de asignarles el alor necesario& class "emitente e@ten%s 0suarioA%apter , 8unction FFconstruct() , parent##__construct()$ $this-MremitenteFi% B 6N / 8unction get() , %this-&usuario_id ' %this-&remitente_id$ parent::get()N / / class (estinatario e@ten%s 0suarioA%apter , 8unction FFconstruct() , parent##__construct()$ $this-M%estinatarioFi% B 6N / 8unction get() , %this-&usuario_id ' %this-&destinatario_id$ parent::get()N / / class !suarioAdapter e@ten%s 0suario , )unction __construct() * %this-&usuarioadapter_id ' %this-&usuario_id$ + 8unction get() , $usuario B ne! 0suario()N $usuario-MusuarioFi% B $this-MusuarioFi%N $usuario-Mget()N 8oreach($usuario as $propert.BM$$alue) , $this-M$propert. B $$alueN / / / The Original Hacker www.originalhacker.org 2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 17 INGENIERA DE SOFTWARE: ARCHIVOS PRE Y POST INSTALACIN/DESINSTALACIN EN LOS PAQUETES DEBIAN EN LA EDICIN NRO. 11 DE LA REVISTA HACKERS & DEVELOPERS MAGAZINE (WWW.HDMAGAZINE.ORG/, ESCRIB UN ARTCULO INTRODUCTORIO SOBRE LA CREACIN DE PAQUETES .DEB, AVANZANDO MUY SUPERFICIALMENTE SOBRE EL DIRECTORIO DEBIAN. EN ESTE PAPER, LA IDEA ES COMENZAR A INSERTARNOS MS A FONDO EN DICHO DIRECTORIO, TOMANDO COMO PUNTO DE PARTIDA, LOS ARCHIVOS DE INSTALACIN Y DESINSTALACIN PROPIOS, QUE PUEDEN EJECUTARSE MEDIANTE DPKG PERO QUE EXCEDEN SU RESPONSABILIDAD. rear un pa"uete 6ebian de forma estndar con los elementos bsicos! no siempre puede resultar ser la solucin ms acertada. Auchas eces! contar con un pa"uete "ue solo BdistribuyaC archios por los diersos directorios! nos "ueda BchicoC y se hace ineitable la necesidad de ejecutar tareas de instalacin ms all de la responsabilidad de %pRg. Para esto! la solucin es incorporar scripts de instalacin propia! dentro del directorio D1K'A( . + Los archios de instalacin propios! pueden ser scripts "ue se ejecuten antes de la instalacin o despu#s de #sta. -ncluso! pueden coe'istir ambos scripts (pre y post instalacin). $stos archios deben crearse dentro del directorio D1K'A( y se los llamar preinst (para ejecutarse antes de la instalacin) y postinst (para ser ejecutado espu3s de la instalacin). Pero la mejor noticia es "ue !os archivos pre ( post-insta!acin para %pRg! pueen ser escritos en cua!)uier !engua$e de programacin! pudiendo ser ese Shell Scripts en #ash hasta pe)ue*os programas en %+%7 %(thon7 8u#( o en cual"uier otro lenguaje soportado. CONSIDERACIONES PREVIAS ,ntes de crear y utilizar los archios D1K'A(/postinst y*o D1K'A(/preinst es necesario tener en cuenta los siguientes factores& 1. Tanto postinst como preinst necesitan permisos de ejecucin Los archios de pre y post instalacin! deben poder Bser ejecutadosC por %pRg! motio por el cual! ser The Original Hacker www.originalhacker.org 2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 18 necesario otorgar permisos e e$ecucin a !os archivos (,-.A/0postinst ( (,-.A/0preinst antes de proceder a su empa"uetado. Para dar permisos de ejecucin al archio! recuerda ejecutar& chmo% I@ D1K'A(/postinst chmo% I@ D1K'A(/preinst 2. %pRg NO elimina archivos ni directorios creados mediante postinst o preinst %i tienes pensado hacer "ue tu pre o post instalador cree archios y*o directorios! antes de decidirlo! ten en cuenta "ue #stos no sern desinstalados cuando %pRg -r pa>uete o %pRg -P pa>uete sean ejecutados. 1na solucin a este inconeniente! puede ser la siguiente& 3. crea un archivo D1K'A(/postrm o D1K'A(/prerm para que archivos y/o directorios creados mediante D1K'A(/postinst y D1K'A(/preinst sean desinstalados al llamar a %pRg -r o %pRg -P 6os archivos prerm ( postrm se e$ecutan antes ( espu3s e )ue dp1g sea !!amao con !os argumentos -r 9remove: o -P 9purge:; $n estos scripts! puedes colocar instrucciones para "ue! por ejemplo! archios y*o directorios creados por postinst o preinst sean desinstalados mediante dpHg. ,l igual "ue los archios de pre y post instalacin! prerm ( postrm necesitan ser creaos con permisos e e$ecucin para "ue %pRg pueda ejecutarlos. ARGUMENTOS ENVIADOS POR DPKG +uando %pRg llama a preinst! el primer argumento "ue le pasa es install! es decir! "ue el archio preinst es llamado por %pRg de la siguiente forma& +/preinst install ,l llamar a postinst! en cambio! el primer argumento ser con8igure& +/postinst con8igure The Original Hacker www.originalhacker.org 2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 19 $stos argumentos! deben ser tenidos en cuenta al momento de desarrollar la lgica pre y post instalacin! para el pa"uete "ue se est# armando. #!/bin/sh set -e i) 2 '%3' '' 'con)igure' 4N then # aiones de onfigurai2n rutaFapacheBC/etc/apache2/sites-a$aila5leC echo -n L'ngrese nom5re %e %ominio: LN rea% %omainFname se% s/D&MA'(F(AM1/$%omainFname/g $rutaFapache/m.app+con8 $rutaFapache/$D&MA'(F(AM1+con8 rm $rutaFapache/m.app+con8 a2ensite $D&MA'(F(AM1+con8 ser$ice apache2 restart else echo C%pRg no me ha llama%o con con8igure as; <ue no e9ecuto na%aC 8i PD1KH1)P12P e@it 6 E$emp!o <1" %hell %cript "ue comprueba en el archio (,-.A/0postinst "ue con8igure haya sido eniado por %pRg para ejecutar las acciones de configuracin correspondientes. %i con8igure no es recibido! imprime un mensaje de error. Ten en cuenta que postinst no ser ejecutado si %pRg es invocado con el argumento --unpacR +uando el argumento --unpacR es pasado a dpHg para la instalacin! justamente! el usuario solo est pidiendo el desempa"uetado del .deb pero no su configuracin. 6ado "ue el archio postinst est destinado a acciones de configuracin! no es llamado si dpHg fue inocado mediante unpacR. The Original Hacker www.originalhacker.org 2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 20 EUROPIO ENGINE LAB: FORMULARIOS WEB Y TABLAS HTML EN SOLO UNOS POCOS PASOS HACE APENAS MENOS DE UN MES, LANC UNA NUEVA VERSIN ESTABLE DE EUROPIO ENGINE: LA 3.2.5. ESTO ME MOTIV A TERMINAR DOS COMPLEMENTOS QUE TENA PENDIENTES: UN GENERADOR DE FORMULARIOS WEB Y OTRO, DE LISTADOS EN TABLAS HTML. EN ESTE ARTCULO VEREMOS COMO EN UNOS POCOS PASOS, PODEMOS CREAR FORMULARIOS Y TABLAS CON ESTOS DOS COMPLEMENTOS. no de los fines de $uropio $ngine! como motor A7+! es abogar por la independencia absoluta de la I1-. $s entonces! "ue se hace necesario crear los archios ?.AL "ue sern implementados en las istas de cada recurso. > esto incluye! por lo menos! a los m#todos agregar! editar y listar. 1 Pero desde ahora! estos tres m#todos podrn generar sus I1- de forma dinmica! gracias a los dos nueos complementos "ue dan origen a este artculo. %e trata de dos plug-ins "ue conseran el estilo independentista de $uropio $ngine. Ambos complementos pueden descargarse desde www.europio.org/downloads/plugins/ > supongo "ue a estas alturas! dems estar decir! "ue al igual "ue $uropio $ngine! ambos complementos son so't=are !i#re! distribuidos bajo los t#rminos de la licencia >N, >%6 v 3;0. EUROPIO WEBFORM: GENERADOR DE FORMULARIOS WEB %e trata de una clase para las istas! "ue permite ir agregando campos de formulario configurables y as generar el formulario "ue realmente se necesite. Insta!acin" .ras descargar el pa"uete ,uropio_5eb6orm_3_3_7_stable.tar.g8 desde el sitio @eb de descargas de $uropio $ngine 9 ! descomprimir y colocar la carpeta !e58orm dentro del directorio +/common/plugins/ de la aplicacin. 9 http&**www.europio.org*downloads*plugins* The Original Hacker www.originalhacker.org 2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 21 Para ha#i!itar e! comp!emento y "ue #ste sea importado de forma automtica por el motor de $uropio! bastar con agregarlo en la ariable $ena5le%Fapps del archio settings+php& $ena5le%Fapps B arra.(C!e58ormC)N %i no se lo habilita desde el settings! puede importarse luego de forma manual! desde el userFimports+php o desde la ista en la "ue se lo desee implementar. ,so" $l primer paso! consiste en crear un objeto :e5Gorm: $action B C/mo%ulo/mo%elo/guar%arCN $metho% B CP&*3CN $8orm B ne! :e5Gorm($action- $metho%)N $l constructor de la clase! puede recibir dos parmetros& el action y method del formulario ?.AL! pero ambos son opcionales. , continuacin! ser necesario agregar los campos de formulario 5de a uno por ez5! utilizando los m#todos Ba%%FJC disponibles. $'iste un m#todo Ba%%FC por cada tipo de campo estndar de formulario& hi%%en! te@t- te@tarea- pass!or%- 8ile- select- ra%io- checR5o@ y su5mit+ :inalmente! para obtener el formulario! se utiliza el m#todo sho!. $n resumen! la clase :e5Gorm se compone de& 9lase# :e5Gorm Par:metros# string $action (opcional) $alor por %e8ecto: C+C string $metho% (opcional) $alor por %e8ecto: CP&*3C ;<todos# a%%Fhi%%en a%%Fte@t a%%Fte@tarea a%%Fpass!or% a%%F8ile a%%Fselect a%%Fra%io a%%FchecR5o@ a%%Fsu5mit sho! Para implementar los m#todos add/J listados anteriormente! los siguientes parmetros debern ser tenidos en cuenta& The Original Hacker www.originalhacker.org 2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 22 ;<todo# void a%%Fhi%en Par:metros# string $name nom5re %el campo string $$alue $alor por %e8ecto (opcional) BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ;<todo# void a%%Fte@t Par:metros# string $name nom5re %el campo string $$alue $alor por %e8ecto (opcional) string $te@t 3e@to a mostrar en la eti<ueta %el campo (opcional) $alor por %e8ecto: $name BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ;<todo# void a%%Fte@tarea Par:metros# string $name nom5re %el campo string $$alue $alor por %e8ecto (opcional) string $te@t 3e@to a mostrar en la eti<ueta %el campo (opcional) $alor por %e8ecto: CMensa9eC BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ;<todo# void a%%Fpass!or% Par:metros# string $name nom5re %el campo string $te@t 3e@to a mostrar en la eti<ueta %el campo (opcional) $alor por %e8ecto: $name BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ;<todo# void a%%F8ile Par:metros# string $name nom5re %el campo string $te@t 3e@to a mostrar en la eti<ueta %el campo (opcional) $alor por %e8ecto: $name BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ;<todo# void a%%Fselect Par:metros# string $name nom5re %el campo array $options colecci?n %e o59etos o %e arra.s asociati$os para las opciones string $te@t 3e@to a mostrar en la eti<ueta %el campo (opcional) $alor por %e8ecto: $name BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ;<todo# void a%%Fra%io- void a%%FchecR5o@ Par:metros# string $groupname nom5re %el grupo %e campos array $options colecci?n %e o59etos o %e arra.s asociati$os para ca%a opci?n string $te@t 3e@to a mostrar como t;tulo %el grupo (opcional) $alor por %e8ecto: C*eleccione las opciones %e su pre8erenciaC BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ;<todo# void a%%Fsu5mit Par:metros# string $$alue te@to %el 5ot?n (opcional) $alor por %e8ecto: C1n$iarC The Original Hacker www.originalhacker.org 2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 23 Los m3toos estinaos a generar m?!tip!es opciones como a%%Fselect! a%%FchecR5o@ y a%%Fra%io- reciben como segundo parmetro un array en el cual! cada uno de los elementos de #ste! pueden ser objetos o arrays asociativos. %ean objetos o diccionarios! las propiedades o parmetros "ue debern incluir! son& value $alor %e ca%a opci?n text te@to a mostrar para ca%a opci?n extras si la opci?n ir= selecciona%a o marca%a por %e8ecto- in%icar C selecte%C o C checRe%C segAn correspon%a+ Daso contrario- un $alor nulo+ 1n ejemplo con uso de array de opciones! podra erse como el siguiente& # se definen @a modo de ejemploB las opiones para dos radio buttons %opcion3 ' array('value''&3, 'texto''&'=uscribirme', 'extras''&' selected')$ %opcion3 ' array('value''&>, 'texto''&'(arme de baa', 'extras''&'')$ # ,e las agrega a un array >ue se pasarC finalmente a addAradio %opciones ' array(%opcion3, %opcion>)$ # 'reo un 4eb$orm $8orm B ne! :e5Gorm(C/mo%ulo/mo%elo/recursoC)N # Hgrego un ampo para >ue el usuario esriba su e-mail $8orm-Ma%%Fte@t(CemailC- (0))- C1-mailC)N # Agrego el grupo de radio buttons (envo mi array de opciones) %)orm-&add_radio('newsletter', %opciones, '?@u< desea hacerA')$ # Hgrego un bot2n de env!o $8orm-Ma%%Fsu5mit()N # Hlmaeno el formulario en una variable $html B $8orm-Msho!()N # Iuestro el formulario dentro de la plantilla general del sitio 4eb $plantilla B 8ileFgetFcontents(APPFD'2 + C/static/html/!e5template+htmlC)N print 3emplate(C(e!sletterC)-Msho!($html)N HACK PARA CONVERTIR COLECCIONES DE OBJETOS EN DICCIONARIOS PARA LOS FORMULARIOS WEB GENERADOS CON EL COMPLEMENTO WEBFORM -maginemos "ue tenemos una coleccin de objetos de tipo Pais cuyas propiedades son paisFi% y %enominacion+ 8ecesitamos un select en un formulario! para "ue el usuario elija el pas de su residencia. +on muy poco! podemos generar diccionarios aptos para a%%Fselect& 8unction agregar($coleccionFpaisesBarra.()) , )oreach(%coleccion_paises as B%ob) * %ob-&value B $o59-MpaisFi%N %ob-&text B $o59-M%enominacionN / # 666 The Original Hacker www.originalhacker.org 2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 24 / Por favor, notar que la variable $o59 est siendo modificada por referencia. Caso contrario, los cambios se perderan al finalizar el bucle 8oreach. COLLECTORVIEWER: VISUALIZANDO COLECCIONES DE OBJETOS EN UNA TABLA HTML Aostrar una coleccin de objetos en una tabla ?.AL! con botones er! editar y eliminar! con filtro de b;s"ueda! paginado y ordenamiento de resultados por columnas! no re"uiere ms de K lneas de cdigo& 8unction listar($coleccion) , $ta5la B 9ollectorCiewer(%coleccion, 'modulo', 'modelo')-&get_table()$ print 3emplate(C3;tulo %e la 3a5laC)-Msho!($ta5la)N / Co!!ector@ie=er generar una tabla ?.AL utilizando $Auer( -ata.a#!es (librera Laa%cript incluida en el pa"uete del plug-in +ollector7iewer) para el paginado! filtro y orden de resultados por columnas. Para instalarlo! basta con descargar el pa"uete ,uropio_DE;FGrid_3_7_3_beta.tar.g8 desde el sitio @eb de descargas de $uropio $ngine 3 . Luego de descomprimir el pa"uete! colocar la carpeta collector$ie!er dentro del directorio +/common/plugins/ de la aplicacin. Para ha#i!itar e! comp!emento y "ue #ste sea importado de forma automtica por el motor de $uropio! bastar con agregarlo en la ariable $ena5le%Fapps del archio settings+php& $ena5le%Fapps B arra.(C!e58ormC- CcollectorviewerC)N %i no se lo habilita desde el settings! puede importarse luego de forma manual! desde el userFimports+php o desde la ista en la "ue se lo desee implementar! tal cual se ha e'plicado para el complemento anteriormente descrito. Para finalizar! se debe copiar el contenido de la carpeta +/common/plugins/collector$i!er/static en el directorio de archios estticos (por defecto& +/static). 3 http&**www.europio.org*downloads*plugins* The Original Hacker www.originalhacker.org 2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 25 OCULTAR LOS BOTONES VER, EDITAR Y ELIMINAR O MOSTRAR SOLO ALGUNO DE ELLOS $s posible "ue no desees mostrar alguno de los botones "ue Dollector>ie!er agrega por defecto a las tablas ?.AL generadas. $n ese caso! cuando se llame a Dollector>ie!er! se le deber indicar Galse o 3rue para ocultar o mostrar los botones er! editar y eliminar respectiamente& # Iostrar el bot2n Jer/desargar y oultar el de editar y eliminar $ta5la B Dollector>ie!er($coleccion- Cmo%uloC- Cmo%eloC- Erue, 6alse, 6alse)-MgetFta5le()N Para er la captura de pantalla de una ta#!a generaa con Europio Engine B Co!!ector@ie=er ingresa en https&**docs.google.com*file*d*MB5@mNm3>OKsN2mLB1I-t81hP%1$*editGuspQdriesdH The Original Hacker www.originalhacker.org 2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 26 SEGURIDAD INFORMTICA: EMULACIN DE TOKENS DE SEGURIDAD TEMPORALES COMO MECANISMO DE VERIFICACIN EN EL REGISTRO DE USUARIOS ASEGURARSE DE QUE EL USUARIO QUE SOLICITA EL REGISTRO ES HUMANO Y DE QUE EL E-MAIL INDICADO ES REALMENTE DE SU PROPIEDAD, ES TAN IMPORTANTE COMO MANTENER AL RESGUARDO LA BASE DE DATOS DE USUARIOS YA CONFIRMADOS. LA EMULACIN TEMPORAL DE TOKENS DE SEGURIDAD ES EL MECANISMO MS SIMPLE Y EFICIENTE PARA PODER LOGRARLO, QUE SE HA UTILIZADO TRADICIONALMENTE. ace ya unas dos o tres semanas atrs! >ui!!ermo 4ontero 5uno de mis alumnos del curso de ,nlisis en P?P5 me preguntaba sobre cmo implementar un sistema e Tokens e Seguria tempora!es en #ases e atos y de all mi promesa de escribir este paper y dedicrselo! pues el tema! fue una idea suya! "ue seguramente resulte de inter#s a muchos programadores. ? $n el mundo de la -ngeniera de %oftware suele ser muy frecuente hablar de BtokensC como mecanismos de seguridad para efectuar alidaciones de diersos tipos. $s importante aclarar "ue un token e programacin7 es en rea!ia una pa!a#ra c!ave o ienti'icaor e! !engua$e mientras "ue !os Tokens e Seguria7 son ispositivos '1sicos "ue electrnica o digitalmente almacenan informacin! "ue sire para identificar al usuario "ue lo porta y son utilizados como medio de autenticacin. Cuano en programacin7 se ha#!a e Tokens e Seguria7 se lo hace en analoga a estos dispositios y usua!mente se !o uti!iCa como sinnimo e Dva!or hashE; 1n alor hash es una cadena de longitud fija obtenida por una funcin H "ue efect;a un resumen (o compactacin) de una cadena M! codificndola de manera irreersible. %e podra concluir entonces! en "ue el proceso e emu!acin e un .oFen e Seguria en programacin! es el resultado de una aplicacin criptogrfica! +94: G valor hash. The Original Hacker www.originalhacker.org 2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 27 GENERACIN DEL TOKEN DE SEGURIDAD O VALOR HASH $l alor ?ash puede ser obtenido mediante un conjunto M a libre eleccin del programador. Por ejemplo! A podra ser la sumatoria del e5mail del usuario y el tiempo P0%-N (timestamp). Aientras tanto! la funcin H podra ser A6R! %?,5R93 o cual"uier otra funcin hash segura& # I = email K timestamp $m B $email + 3ime()N $$alorFhash B hash(CshaS12C- $m)N FLUJO DE PROCEDIMIENTOS: EN QU CONSISTE EL MECANISMO DE VERIFICACIN? 9. $l flujo de procedimientos comienza con el usuario completando sus atos e registro mediante un formularioE 3. +uando este formulario es eniado! se genera el Token e Seguria y se lo almacena junto a los datos de registros en una ta#!a e registro tempora!E S. , continuacin! se ena un e-mai! al usuario con el token generadoE K. $l usuario deber ingresar en la aplicacin (ya sea por I$. o P0%.) el toHen recibido por e5mail! el cul deber ser comparao con e! token a!macenao en !a ta#!a e registro tempora!. $n caso de coincidir! se inserta e! registro en !a ta#!a e usuarios con'irmaos y se e!imina e! mismo7 e !a ta#!a tempora!. TABLA DE REGISTRO TEMPORAL La tabla de registro temporal e#e ser un c!on eHacto e !a ta#!a e usuarios con'irmaos. $s importante "ue la tabla de usuarios confirmados cuente con un campo BtoHenC y un timestamp! ya "ue incluso! estando confirmado un usuario! un nueo toHen podra ser de utilidad para efectuar una restauracin de contrase<a. 1na ez creada la tabla principal (la de usuarios confirmados)! puede obtenerse una copia e'acta de la misma (un clon) con la siguiente sentencia %OL& D21A31 3AK)1 tmpAusers )'T1 usersN COMPARACIN DE TOKENS E INTERCAMBIO DE REGISTROS La comparacin de .oHens e intercambio de registro! puede hacerse en un ;nico paso! insertando el registro en tabla final! mediante una seleccin del mismo en la tabla temporal& The Original Hacker www.originalhacker.org 2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA 28 '(*123 '(3& users *1)1D3 J G2&M tmpFusers :H121 toRen B H %i el resultado de la ejecucin anterior es erdadero! entonces simplemente! se elimina el registro de la tabla temporal& D1)131 G2&M tmpFusers :H121 toRen B H OPTIMIZANDO RECURSOS La optimizacin no solo de recursos sino tambi#n de procesos! forma parte de una buena poltica de seguridad& cuanto ms optimi!ada se encuentra una aplicaci"n, ms simple se hace la detecci"n de errores y ms se reducen los riesgos de #allos y de #ugas de in#ormaci"n $s imprescindible "ue la tabla destinada al registro temporal! sea erificada de forma peridica a fin de eitar la sobre5inde'acin de registros "ue pudiesen ser producto de intentos masios y automatizados! de registros falsos. Limpiar la tabla temporal de falsos registros y optimizar sus ndices y el espacio libre! preiene la saturacin de recursos y su consiguiente falta de disponibilidad. %e puede crear entonces! una tarea programada con cronta5 E "ue ejecute un archio encargado de recorrer la tabla temporal! en busca de registros donde el timestamp del registro T 93 horas! por ejemplo! sea inferior al timestamp actual y a continuacin! eliminar dichos registros obsoletos y optimizar la tabla& #!/bin/bash U012VF1)'M'(A2BCD1)131 G2&M tmpFusers :H121 3'M1*3AMP(timestamp- C12:66:66C) W (&:()NC U012VF&P3'M'XA2BC&P3'M'X1 3AK)1 tmpFusersNC m.s<l -u usuario -plave -e L$U012VF1)'M'(A2 $U012VF&P3'M'XA2L > finalmente& # Hgregar permisos de ejeui2n al arhivo chmo% I@ /ruta/a/script+sh # 0 agregar la tarea programada al ron on rontab cronta5 -e @%ail. /ruta/a/scipt+sh S 2ecomiendo leer el artculo B,ctualizando tus aplicaciones con +ronC "ue escrib para la reista ?acHers U 6eelopers Aagazine 8VW& http&**www.eugeniabahit.com*static*pdf*L-81N%>%,6A-8X3M5X3M+ron.pdf 1310258856007 1310258856007 1 1 310258 856007