THE ORIGINAL HACKER

SOFTWARE LIBRE, HACKING y PROGRAMACIÓN, EN UN PROYECTO DE

EUGENIA BAHIT

Buenos Aires, 5 de Noviembre de 2013

@eugeniabahit
GLAMP HACKER Y PROGRAMADORA EXTREMA
HACKER ESPECIALIZADA EN PROGRAMACIÓN EXTREMA E INGENIERÍA INVERSA DE CÓDIGO SOBRE GNU/LINUX, APACHE, MYSQL, PYTHON Y PHP. EUGENIABAHIT.COM DOCENTE E INSTRUCTORA DE TECNOLOGÍAS 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 EDICIÓN NRO1
SHELL SCRIPTING: ANÁLISIS DE ARGUMENTOS
ENVIADOS POR LÍNEA DE COMANDOS MEDIANTE PYTHON C O N A R G P A R S E .................................3

PROCESOS DE RAZONAMIENTO INVERSO: PATRÓN 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 INGENIERÍA DE SOFTWARE: ARCHIVOS PRE Y POST INSTALACIÓN /DESINSTALACIÓN 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 INFORMÁTICA: EMULACIÓN 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

3

DE ARGUMENTOS ENVIADOS POR LÍNEA DE COMANDOS MEDIANTE PYTHON CON ARGPARSE
ARGPARSE ES UN MÓDULO DE LA LIBRERÍA ESTÁNDAR DE PYTHON, QUE REEMPLAZANDO A OPTPARSE DESDE LA VERSIÓN 2.7 DEL LENGUAJE, SE HA CONVERTIDO EN EL MÓDULO POR EXCELENCIA PARA ANALIZAR LOS ARGUMENTOS ENVIADOS A TRAVÉS DE LA LÍNEA DE COMANDOS.

ANÁLISIS

SHELL SCRIPTING:

$

l módulo argparse forma parte de la librería de módulos estándar de Python y su finalidad es la de analizar los argumentos en iados al programa mediante línea de comandos! facilitando las mismas funcionalidades "ue el obsoleto optparse pero incorporando ciertas características con las "ue #ste no contaba. %e trata de un módulo 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 rápida un script principal (main) para cual"uier tipo de aplicación de consola! incluso! a"uellas programadas con bash u otros lenguajes "ue no cuenten con tanta facilidad para! por ejemplo! el análisis de argumentos y*o la generación de ayudas en pantalla. +on solo agregar una lista de argumentos a ArgumentParser()! el módulo se encargará de poner a disposición del usuario de la aplicación! los argumentos -h y --help y generar de forma automática! 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

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 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 ersión 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 disposición del usuario! con unas pocas líneas de código fuente.

INTRODUCCIÓN
Importación e! mó u!o" Para comenzar a utilizar argparse! bastará con importar la clase ArgumentParser()&

8rom argparse import ArgumentParser

Construcción e un o#$eto Argument%arser" +onstruir un objeto ArgumentParser! es una forma de inicializar los datos principales de la aplicación. $l m#todo constructor del objeto ,rgumentParser (función //init//)! si bien puede ser in ocado sin argumentos! permite (entre otros)! los siguientes parámetros&

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

5

version

nAmero %e $ersi?n %el programa

.odos estos parámetros son opcionales pero sin embargo! si se indicase el parámetro $ersion! automáticamente dispondríamos de la opción -$ 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 parámetro! 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)

,demás del argumento en sí mismo! a%%Fargument() puede recibir muchos otros parámetros. $ntre los más frecuentes! podemos encontrar los siguientes& action 6escripción& ,cción "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

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- %estBClengua9esCactionBCappen%FconstC- constBCphpC) argp+a%%Fargument(C--p.thonC- %estBClengua9esCactionBCappen%FconstC- constBCp.thonC) --php --python genera: lenguajes = ['php', 'python'] nargs 6escripción& +antidad de alores "ue pueden recibirse para el argumento en cuestión. 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

7

argp+a%%Fargument(C--ta5leC- nargsBCIC) argp+a%%Fargument(C--rangoC- nargsB2) e'au!t 6escripción& 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 6escripción& $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 6escripción& 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 6escripción& -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 6escripción& .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

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 6escripción& 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 ANÁLISIS 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 línea de comandos! seg;n su configuración! 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:

, continuación! el código "ue generó el te'to de ayuda del ejemplo al comienzo del artículo&

#!/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

9

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: PATRÓN DE DISEÑO ADAPTER EN PYTHON Y PHP, LOS “CÓMO” 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. SOLUCIÓN: UTILIZAS UN ADAPTADOR. BIENVENIDAS/OS AL PATRÓN DE DISEÑO ADAPTER.

8

ecesitaba un ejemplo sencillo "ue me permitiese demostrar isualmente! cómo funciona el patrón de dise<o ,dapter y el ejemplo del enchufe! me ino =como anillo al dedo». Pues no podría ser más claro& es la imagen perfecta e ine"uí oca para comprender este mara illoso patrón de dise<o. $n la programación orientada a objetos! un patrón comportamiento e ise*o

representa la 'orma en !a cua! se pue e reso!ver e! e un o#$eto o !a re!ación entre e!!os y el patrón de dise<o Adapter (adaptador) resuel e la necesidad de conectar dos (o más) objetos entre sí! dónde al menos uno de ellos necesitaría 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 típico 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 típico 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 encontraríamos con una tabla de mensajes! con un campo remitente/id! otro destinatario/id! y otros más destinados a almacenar la fecha! el asunto y el cuerpo del mensaje! por ejemplo. > lo anterior! arrojaría como resultado una clase con propiedades simples y complicados y errados m#todos no estándar! "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 aría 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! sería un ejemplo sobre cómo las Bmalas costumbresC nos lle an a pensar en siguiente definición 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 encontraríamos con la

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

The Original Hacker – www.originalhacker.org

12

$sto! nos haría deducir! correctamente! "ue 2emitente y 6estinatario! serían 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! tendría 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 más reales! relacionalmente lógicos y estructuralmente coherentesE Lograr una mayor legibilidad y facilidad de comprensiónE 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í tendríamos los siguientes objetos y relaciones& irectamente con e! o#$eto ,suario5 La razón es sencilla y es "ue en la orientación 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 debería in ocarse! tendría "ue ser el m#todo get() de 1suario! ya "ue a decir erdad! es el erdadero compositor.

Mensaje debería recurrir al método 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 dónde la BadaptaciónC real sale a la luz. 2emitente y 6estinatario al fin deberán BadaptarC las Bcla ijasC de 0suario para ser insertadas en el Btoma corrienteC de Mensa9e+ $s entonces cuando la función transformadora de ambos objetos! pasa a ser la adaptación del m#todo get() de 0suario&

Cuando Mensa9e llame al método get de 2emitente y Destinatario- en realidad deberá ser el método get de 0suario quien deba ejecutarse y luego, transformar a 0suario en un 2emitente y en un Destinatario respectivamente.

2emitente y Destinatario! deberán 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. > sería 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 métodos idénticos, se extrae el método repetido y se lo lleva a la clase Madre
Pero F"u# sucedería si este m#todo fuese lle ado a la clase madreG +laramente! estaríamos eliminando el erdadero m#todo get() de 1suario. $ntonces! la solución 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! sería "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 método constructor en las clases, no porque no deba utilizarse (al contrario), sino porque no es de relevancia para el ejemplo.

:inalmente! la relación "uedaría como la siguiente&

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

The Original Hacker – www.originalhacker.org

16

PATRÓN DE DISEÑO ADAPTER EN EUROPIO ENGINE
%i estás 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 homónimas! 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

INGENIERÍA
EN

INSTALACIÓN/DESINSTALACIÓN

DE SOFTWARE: ARCHIVOS PRE Y POST PAQUETES

LOS

DEBIAN

EN

LA EDICIÓN NRO. 11 DE LA REVISTA HACKERS & DEVELOPERS MAGAZINE (WWW.HDMAGAZINE.ORG/, ESCRIBÍ UN ARTÍCULO INTRODUCTORIO SOBRE LA CREACIÓN DE PAQUETES .DEB, AVANZANDO MUY SUPERFICIALMENTE SOBRE EL DIRECTORIO DEBIAN. EN ESTE PAPER, LA IDEA ES COMENZAR A INSERTARNOS MÁS A FONDO EN DICHO DIRECTORIO, TOMANDO COMO PUNTO DE PARTIDA, LOS ARCHIVOS DE INSTALACIÓN Y DESINSTALACIÓN PROPIOS, QUE PUEDEN EJECUTARSE MEDIANTE DPKG PERO QUE EXCEDEN SU RESPONSABILIDAD.

+

rear un pa"uete 6ebian de forma estándar con los elementos básicos! no siempre puede resultar ser la solución más 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 instalación más allá de la responsabilidad de %pRg. Para esto! la solución es incorporar scripts de instalación propia! dentro del directorio D1K'A( . Los archi os de instalación propios! pueden ser scripts "ue se ejecuten antes de la instalación o despu#s de #sta. -ncluso! pueden coe'istir ambos scripts (pre y post instalación). $stos archi os deben crearse dentro del directorio D1K'A( y se los llamará preinst (para ejecutarse antes de la instalación) y postinst (para ser ejecutado espu3s de la instalación). Pero la mejor noticia es "ue !os archivos pre ( post-insta!ación para %pRg! pue en ser escritos en cua!)uier !engua$e de programación! 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 ejecución

Los archi os de pre y post instalación! 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$ecución a !os archivos (,-.A/0postinst ( (,-.A/0preinst antes

Para dar permisos de ejecución 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 serán desinstalados cuando %pRg -r pa>uete o %pRg -P pa>uete sean ejecutados. 1na solución 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 instalación! prerm ( postrm necesitan ser crea os con permisos e e$ecución 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 lógica pre y post instalación! 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 configuración 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 instalación! justamente! el usuario solo está pidiendo el desempa"uetado del .deb pero no su configuración. 6ado "ue el archi o postinst está destinado a acciones de configuración! 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 VERSIÓN ESTABLE DE EUROPIO ENGINE: LA 3.2.5. ESTO ME MOTIVÓ A TERMINAR DOS COMPLEMENTOS QUE TENÍA PENDIENTES: UN GENERADOR DE FORMULARIOS WEB Y OTRO, DE LISTADOS EN TABLAS HTML. EN ESTE ARTÍCULO VEREMOS COMO EN UNOS POCOS PASOS, PODEMOS CREAR FORMULARIOS Y TABLAS CON ESTOS DOS COMPLEMENTOS.

1

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 serán 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 podrán generar sus I1- de forma dinámica! gracias a los dos nue os complementos "ue dan origen a este artículo. %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! demás 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!ación" .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 aplicación.

9

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 automática 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 parámetros& el action y method del formulario ?.AL! pero ambos son opcionales. , continuación! 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 estándar 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 parámetros deberán 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 parámetro 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 parámetros "ue deberán 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! podría 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 (envío 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 colección de objetos de tipo Pais cuyas propiedades son paisFi% y %enominacion+ 8ecesitamos un select en un formulario! para "ue el usuario elija el país 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 perderían al finalizar el bucle 8oreach.

COLLECTORVIEWER: VISUALIZANDO COLECCIONES DE OBJETOS EN UNA TABLA HTML
Aostrar una colección 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 más de K líneas de código&

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 (librería 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 aplicación. Para ha#i!itar e! comp!emento y "ue #ste sea importado de forma automática 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 estáticos (por defecto& +/static).

3

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 INFORMÁTICA: EMULACIÓN DE TOKENS DE
SEGURIDAD TEMPORALES COMO MECANISMO DE VERIFICACIÓN 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 EMULACIÓN TEMPORAL DE TOKENS DE SEGURIDAD ES EL MECANISMO MÁS SIMPLE Y EFICIENTE PARA PODER LOGRARLO, QUE SE HA UTILIZADO TRADICIONALMENTE.

?

ace ya unas dos o tres semanas atrás! >ui!!ermo 4ontero 5uno de mis alumnos del curso de ,nálisis en P?P5 me preguntaba sobre cómo implementar un sistema e Tokens e Seguri a tempora!es en #ases e atos y de allí mi promesa de escribir este paper y dedicárselo! pues el tema! fue una idea suya! "ue seguramente resulte de inter#s a muchos programadores. $n el mundo de la -ngeniería 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 programación7 es en rea!i a i enti'ica or Seguri a 7 son ispositivos una pa!a#ra c!ave o e o "ue electrónica e! !engua$e mientras "ue !os Tokens '1sicos

digitalmente almacenan información! "ue sir e para identificar al usuario "ue lo porta y son utilizados como medio de autenticación. Cuan o en programación7 se ha#!a e Tokens e Seguri a 7 se lo hace en analogía a estos dispositi os y usua!mente se !o uti!iCa como sinónimo e Dva!or hashE;

1n

alor hash es una cadena de longitud fija obtenida por una función H "ue efect;a un resumen (o e emu!ación e un .oFen e Seguri a en programación ! es el resultado de una aplicación

compactación) de una cadena M! codificándola de manera irre ersible. %e podría concluir entonces! en "ue el proceso criptográfica! +94: G valor hash.

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

The Original Hacker – www.originalhacker.org

27

GENERACIÓN DEL TOKEN DE SEGURIDAD O VALOR HASH
$l alor ?ash puede ser obtenido mediante un conjunto M a libre elección del programador. Por ejemplo! A podría ser la sumatoria del e5mail del usuario y el tiempo P0%-N ( timestamp). Aientras tanto! la función H podría ser A6R! %?,5R93 o cual"uier otra función 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 VERIFICACIÓN?
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. , continuación! se en ía un e-mai! al usuario con el token generadoE K. $l usuario deberá ingresar en la aplicación (ya sea por I$. o P0%.) el toHen recibido por e5mail! el cuál 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 podría ser de utilidad para efectuar una restauración 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

COMPARACIÓN DE TOKENS E INTERCAMBIO DE REGISTROS
La comparación de .oHens e intercambio de registro! puede hacerse en un ;nico paso! insertando el registro en tabla final! mediante una selección 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 ejecución 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 optimización no solo de recursos sino tambi#n de procesos! forma parte de una buena política 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 periódica a fin de e itar la sobre5inde'ación 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 saturación 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 continuación! 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

S

2ecomiendo leer el artículo 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

Sign up to vote on this title
UsefulNot useful