Está en la página 1de 29

THE ORIGINAL HACKER

SOFTWARE LIBRE, HACKING y PROGRAMA-


CIN, EN UN PROYECTO DE
EUGENIA BAHIT

@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

También podría gustarte