You are on page 1of 29

THE ORIGINAL HACKER

SOFTWARE LIBRE, HACKING y PROGRAMACIN, EN UN PROYECTO DE

EUGENIA BAHIT

Buenos Aires, 5 de Noviembre de 2013

@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 FOUNDATION FOUNDATION
LA FREE SOFTWARE FSF.ORG, THE LINUX LINUXFOUNDATION.ORG E INTEGRANTE DEL EQUIPO DE DEBIAN HACKERS DEBIANHACKERS.NET.

NDICE DE LA EDICIN NRO1


SHELL SCRIPTING: ANLISIS DE ARGUMENTOS
ENVIADOS POR LNEA DE COMANDOS MEDIANTE PYTHON C O N A R G P A R S E .................................3

PROCESOS DE RAZONAMIENTO INVERSO: PATRN DE D I S E O A D A P T E R E N P Y T H O N Y PH P, L O S C M O Y L O S P A R A Q U ..............................10 INGENIERA DE SOFTWARE: ARCHIVOS PRE Y POST INSTALACIN /DESINSTALACIN EN LOS PAQUETES D E B I A N ......................................17 EUROPIO ENGINE LAB: FORMULARIOS WEB Y TABLAS HTML E N S O L O U N O S P O C O S P A S O S ..............20 SEGURIDAD INFORMTICA: EMULACIN DE TOKENS DE
SEGURIDAD TEMPORALES COMO MECANISMO DE V E R I F I C A C I N E N E L R E G I S T R O D E U S U A R I O S . . . . .26

CREADORA DE PYTHON-PRINTR, EUROPIO ENGINE, JACKTHESTRIPPER. VIM CONTRIBUTOR. FUNDADORA DE HACKERS N' DEVELOPERS MAGAZINE Y RESPONSABLE EDITORIAL HASTA OCTUBRE '13.

2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA

The Original Hacker www.originalhacker.org

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.

ANLISIS

SHELL SCRIPTING:

l mdulo argparse forma parte de la librera de mdulos estndar de Python y su finalidad es la de analizar los argumentos en iados 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 alternati a 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 -v, --version show this help message and exit show program's version number and exit

2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA

The Original Hacker www.originalhacker.org

-% 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 obser ar 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! respecti amente. -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! m u!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 in ocado sin argumentos! permite (entre otros)! los siguientes parmetros&

prog description epilog

por %e8ecto es el nom5re %el archi$o aun<ue en circunstancias mu. puntualespo%r;a mo%i8icarse una %escripci?n %el programa <ue ser= mostra%a al inicio %e la a.u%a te@to <ue ser= mostra%o al 8inal %e la a.u%a

2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA

The Original Hacker www.originalhacker.org

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 programaCepilogBCDop.right 261E Autor 5a9o licencia 4P) $E+6C )

0tros par&metros a miti os 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 storeFconst almacena el $alor (acci?n pre%etermina%a) 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

2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA

The Original Hacker www.originalhacker.org

.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- %estBClengua9esCactionBCappen%FconstC- constBCphpC) argp+a%%Fargument(C--p.thonC- %estBClengua9esCactionBCappen%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 I J 21MA'(D12 uno o ninguno uno o m=s cero o m=s 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&

2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA

The Original Hacker www.originalhacker.org

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 Galse Argumento o5ligatorio 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

2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA

The Original Hacker www.originalhacker.org

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 print argumentos+8oo

on:

, 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 posterioresLLLepilogBCDop.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%B3ruehelpBC(om5re %el %ominio a con8igurarC- %estBC%omainC)

2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA

The Original Hacker www.originalhacker.org

argp+a%%Fargument( C-aC- C--aliasC- actionBCstoreC- re<uire%BGalse- nargsBCJChelpBCAlias %e %ominioC- %estBCaliasC ) argp+a%%Fargument( C-lC- C--languageC- choicesB"CstaticC- Cp.thonC- CphpC#actionBCstoreC- re<uire%BGalse- %e8aultBCstaticC- nargsBCHChelpBC)engua9e pre%etermina%o %el sitio :e5C- %estBClanguageC ) argp+a%%Fargument( C-uC- C--userC- actionBCstoreC- %e8aultBC!!!-%ataC- re<uire%BGalsehelpBC0suario %el %ominioC- %estBCusernameC ) argp+a%%Fargument( C-pC- C--pathC- actionBCstoreC- %e8aultBC/sr$/!e5sites/Cre<uire%BGalse- helpBCDirectorio ra;z %e archi$os :e5C- %estBCpathC ) argp+a%%Fargument( C-lpC- C--log-pathC- actionBCstoreC- %e8aultBC/sr$/!e5sites/logs/Cre<uire%BGalsehelpBCDirectorio en el <ue ser=n almacena%os los logs %e ApacheC%estBClogpathC ) argp+a%%Fargument( C--sen%-emailC- actionBCstoreFtrueC- re<uire%BGalsehelpBC*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%BGalsehelpBC>=li%o si --sen%-email se ha in%ica%o+C- %estBCemailC ) args B argp+parseFargs() print $ars(args) # """"" $%& '()%*+ ,'-%./ .0/1+& """"" # eje u i2n del s ript 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': 'eugeniabahit6 om', 'language': 'php', 'sendemail': $alse, 'logpath': '/srv/3ebsites/logs/', 'alias': ['3336eugeniabahit6 om'], 'path': '/srv/3ebsites/', 'email': &one9

2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA

The Original Hacker www.originalhacker.org

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"u oca para comprender este mara illoso patrn de dise<o. $n la programacin orientada a objetos! un patrn comportamiento e ise*o

representa la 'orma en !a cua! se pue e reso!ver e! e un o#$eto o !a re!acin entre e!!os y el patrn de dise<o Adapter (adaptador) resuel e 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):

2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA

The Original Hacker www.originalhacker.org

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 en iar 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+asuntomensa9e+cuerpomensa9e+8echamensa9e+esta%ousuario+nom5re A* remitenteusuario+nom5re A* %estinatario mensa9e '((12 O&'( usuario &( mensa9e+remitenteFi% B usuario+usuarioFi% &2 mensa9e+%estinatarioFi% B usuario+usuarioFi%

G2&M

etc+

> luego la clase Aensaje deri ara del dise<o pre io 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 lle an a pensar en siguiente definicin inicial del objeto mensaje& $l mensaje tiene 9 remitente $l mensaje tiene 9 destinatario D

atos. Pero sin

embargo! po r1amos pensar estrictamente en o#$etos y en este caso! nos encontraramos con la

2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA

The Original Hacker www.originalhacker.org

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

respecti amente&

# =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 fun i2n llamada ompose@+bjeto-e>uerido, objetoA ompositorB uyo fin ser!a el de omponer a la propiedad para mCs informa i2n, se puede leer sobre el patr2n de diseDo ompuesto en .ython en http://3336buboE6es/libros/F5GF##//eoria-sinta ti ogramati al-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 , /

2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA

The Original Hacker www.originalhacker.org

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 !!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& irectamente con e! o#$eto ,suario5 La razn es sencilla y es "ue en la orientacin objetos bien implementada! !as propie a es compuestas

-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!a os! creados para satisfacer las e'igencias del objeto Aensaje. > en realidad! cuando el m#todo get() de Aensaje sea in ocado y #ste! intente componer sus dos propiedades ( Mensa9e+remitente y Mensa9e+%estinatario)! el m#todo get() real al "ue debera in ocarse! 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

2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA

The Original Hacker www.originalhacker.org

14

,"u es dnde la BadaptacinC real sale a la luz. 2emitente y 6estinatario al fin debern BadaptarC las Bcla ijasC 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 in ocados& ez "ue 2emitente+get() y Destinatario+get() sean

# =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 lle ado 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 nue a clase y hacer heredar a 2emitente y destinatario de esta nue a clase. > #sta! a la ez! sera "uien herede de 1suario&

# =n .1. class !suarioAdapter e@ten%s !suario ,

2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA

The Original Hacker www.originalhacker.org

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&

2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA

The Original Hacker www.originalhacker.org

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 in ocar 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 respecti amente. Lo propio suceder con la propiedad id de 1suario,dapter. Por lo tanto! habr "ue agregar a 2emitente- Destinatario y 0suarioA%apter! sus respecti as 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 / / /

2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA

The Original Hacker www.originalhacker.org

17

INGENIERA
EN

INSTALACIN/DESINSTALACIN

DE SOFTWARE: ARCHIVOS PRE Y POST PAQUETES

LOS

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 archi os por los di ersos directorios! nos "ueda BchicoC y se hace ine itable 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 archi os 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 archi os 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! pue en ser escritos en cua!)uier !engua$e de programacin! pudiendo ser lenguaje soportado. es e Shell Scripts en #ash hasta pe)ue*os programas en %+%7 %(thon7 8u#( o en cual"uier otro

CONSIDERACIONES PREVIAS
,ntes de crear y utilizar los archi os 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 archi os de pre y post instalacin! deben poder Bser ejecutadosC por %pRg! moti o por el cual! ser

2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA

The Original Hacker www.originalhacker.org

18

necesario otorgar permisos de proceder a su empa"uetado.

e e$ecucin a !os archivos (,-.A/0postinst ( (,-.A/0preinst antes

Para dar permisos de ejecucin al archi o! 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 archi os 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 incon eniente! 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 !!ama o con !os

argumentos -r 9remove: o -P 9purge:; $n estos scripts! puedes colocar instrucciones para "ue! por ejemplo! archi os y*o directorios creados por postinst o preinst sean desinstalados mediante dpHg. ,l igual "ue los archi os de pre y post instalacin! prerm ( postrm necesitan ser crea os 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 archi o preinst es llamado por %pRg de la siguiente forma&

+/preinst install

,l llamar a postinst! en cambio! el primer argumento ser con8igure&

+/postinst con8igure

2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA

The Original Hacker www.originalhacker.org

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 # a iones de onfigura i2n 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 archi o (,-.A/0postinst "ue con8igure haya sido en iado 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 archi o postinst est destinado a acciones de configuracin! no es llamado si dpHg fue in ocado mediante unpacR.

2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA

The Original Hacker www.originalhacker.org

20

EUROPIO ENGINE LAB: FORMULARIOS WEB Y TABLAS HTML EN SOLO


UNOS POCOS PASOS
HACE MES,
APENAS MENOS DE UN 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 archi os ?.AL "ue sern implementados en las istas de cada recurso. > esto incluye! por lo menos! a los m#todos agregar! editar y listar. Pero desde ahora! estos tres m#todos podrn generar sus I1- de forma dinmica! gracias a los dos nue os complementos "ue dan origen a este artculo. %e trata de dos plug-ins "ue conser an 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 $ngine9! descomprimir y colocar la carpeta !e58orm dentro del directorio +/common/plugins/ de la aplicacin.

http&**www.europio.org*downloads*plugins*

2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA

The Original Hacker www.originalhacker.org

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 archi o 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 string $metho% ;<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! (opcional) (opcional) $alor por %e8ecto: C+C $alor por %e8ecto: CP&*3C

Para implementar los m#todos add/J listados anteriormente! los siguientes parmetros debern ser tenidos en cuenta&

2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA

The Original Hacker www.originalhacker.org

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

2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA

The Original Hacker www.originalhacker.org

23

Los m3to os

estina os 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 text extras

$alor %e ca%a opci?n te@to a mostrar para ca%a opci?n 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 op iones para dos radio buttons %opcion3 ' array('value''&3, 'texto''&'=uscribirme', 'extras''&' selected')$ %opcion3 ' array('value''&>, 'texto''&'(arme de ba a', '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 es riba 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 # Hlma eno 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

2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA

The Original Hacker www.originalhacker.org

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 La a%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 $ngine3. 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 archi o 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 archi os estticos (por defecto& +/static).

http&**www.europio.org*downloads*plugins*

2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA

The Original Hacker www.originalhacker.org

25

OCULTAR
ELLOS

LOS BOTONES VER, EDITAR Y ELIMINAR O MOSTRAR SOLO ALGUNO DE

$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 respecti amente&

# Iostrar el bot2n Jer/des argar y o ultar 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 genera a con Europio Engine B Co!!ector@ie=er ingresa en https&**docs.google.com*file*d*MB5@mNm3>OKsN2mLB1I-t81hP%1$*editGuspQdri esdH

2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA

The Original Hacker www.originalhacker.org

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 Seguri a 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 di ersos tipos. $s importante aclarar "ue un token e programacin7 es en rea!i a i enti'ica or Seguri a 7 son ispositivos una pa!a#ra c!ave o e o "ue electrnica e! !engua$e mientras "ue !os Tokens '1sicos

digitalmente almacenan informacin! "ue sir e para identificar al usuario "ue lo porta y son utilizados como medio de autenticacin. Cuan o en programacin7 se ha#!a e Tokens e Seguri a 7 se lo hace en analoga a estos dispositi os 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 e emu!acin e un .oFen e Seguri a en programacin ! es el resultado de una aplicacin

compactacin) de una cadena M! codificndola de manera irre ersible. %e podra concluir entonces! en "ue el proceso criptogrfica! +94: G valor hash.

2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA

The Original Hacker www.originalhacker.org

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 formularioE 3. +uando este formulario es en iado! se genera el Token datos de registros en una ta#!a e registro tempora!E S. , continuacin! se en a 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 compara o con e! token a!macena o en !a ta#!a !a ta#!a tempora!. e registro tempora! . $n caso de coincidir! se inserta e! registro en !a ta#!a e usuarios con'irma os y se e!imina e! mismo7 e e Seguri a y se lo almacena junto a los atos e registro mediante un

TABLA DE REGISTRO TEMPORAL


La tabla de registro temporal e#e ser un c!on eHacto e !a ta#!a e usuarios con'irma os . $s importante "ue la tabla de usuarios confirmados cuente con un campo BtoHenC y un timestamp! ya "ue incluso! estando confirmado un usuario! un nue o 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&

2013 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA

The Original Hacker www.originalhacker.org

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 m s optimi!ada se encuentra una aplicaci"n, m s simple se hace la detecci"n de errores y m s 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 e itar la sobre5inde'acin de registros "ue pudiesen ser producto de intentos masi os y automatizados! de registros falsos. Limpiar la tabla temporal de falsos registros y optimizar sus ndices y el espacio libre! pre iene la saturacin de recursos y su consiguiente falta de disponibilidad. %e puede crear entonces! una tarea programada con cronta5E "ue ejecute un archi o 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 -p lave -e L$U012VF1)'M'(A2 $U012VF&P3'M'XA2L

> finalmente&
# Hgregar permisos de eje u i2n al ar hivo chmo% I@ /ruta/a/script+sh # 0 agregar la tarea programada al cronta5 -e @%ail. /ruta/a/scipt+sh ron on rontab

2ecomiendo leer el artculo B,ctualizando tus aplicaciones con +ronC "ue escrib para la re ista ?acHers U 6e elopers Aagazine 8VW& http&**www.eugeniabahit.com*static*pdf*L-81N%>%,6A-8X3M5X3M+ron.pdf

1
1310258856007
1310258856007

1 310258

856007

You might also like