Está en la página 1de 42

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, 25 de
Febrero de 2014
NDICE DE LA
EDICIN NRO4
BASH SCRIPTING AVANZADO: SUSTITUCIN DE
PARMETROS Y MANIPULACIN DE VARIABLES........3
SEGURIDAD INFORMTICA: EUROPIOCODE, UN SISTEMA
DE CODIFICACIN DE CARACTERES BASADO EN EL
MODELO SAC DE 3 CAPAS......................10
INGENIERA INVERSA: SOLO EL QU PUEDE
DESVELAR EL CAMINO HACIA EL CMO..........24
INGENIERA DE SOFTWARE: WRAPPERS Y DECORADORES
EN PYTHON...................................30
EUROPIOENGINE LAB: SECURITYLAYER, UNA CAPA DE
SEGURIDAD INTELIGENTE........................37
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
3
BASH SCRIPTING
AVANZADO: SUSTITUCIN
DE PARMETROS Y
MANIPULACIN DE
VARIABLES
DE FORMA REALMENTE
SIMPLE Y SENCILLA, ES
POSIBLE MANIPULAR
VARIABLES EN BASH, PARA
RESOLVER NECESIDADES TAN
FRECUENTES COMO EL
CONTROL DE ARGUMENTOS
PASADOS AL GUIN HASTA
ACCIONES COMO RENOMBRAR
ARCHIVOS EN MASA.
n la mayora de los casos, tan solo se requiere una lnea de
cdigo y sin embargo, por lo general, nos olvidamos de
utilizarla u optamos por complejos algoritmos.
s notable tambi!n, la cantidad de veces que recurrimos a
lenguajes interpretados m"s recientes que bash, creyendo que los
mismos cubren ausencias que realmente no son tales. #ecurrir a
lenguajes como $erl o $ython en la creacin de guiones de Shell es
tan %recuente que hasta llegamos a olvidarnos de la grandeza de
bash.
&ambi!n es muy %recuente recurrir al empleo de comandos para
resolver necesidades que el lenguaje contempla en su propia
sinta'is.
MANIPULACIN DE VARIABLES:
BSQUEDA Y REEMPLAZO
n bash, es posible e%ectuar b(squedas y sustituciones de manera
r"pida y %le'ible sin recurrir una lista interminable de comandos
concatenados. n este aspecto, la necesidad m"s %recuente con la
que nos encontramos, es sustituir determinadas apariiones
en una adena de te!to. sto es posible con una simple
instruccin)
${variable//bsqueda/reemplazo}
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
4
$or ejemplo)
cadena='Hola mundo; Adis mundo'
buscar='mundo'
reemplazar='mundo!'
eco ${cadena//$buscar/$reemplazar}
*rrojar" el siguiente resultado)
Hola mundo!; Adis mundo!
+ale aclarar que el cdigo anterior es equivalen a)
cadena='Hola mundo; Adis mundo'
eco ${cadena//'mundo'/'mundo!'}
*unque en este caso en particular, en la b(squeda no seran necesarias las comillas.
Notar que la doble barra diagonal // es la que indica que la sustitucin debe
hacerse en todas las apariciones
s posible adem"s, sustituir so"o "a primera aparii#n de la b(squeda en la cadena, con tan solo omitir
una de las barras diagonales del comienzo)
cadena='Hola mundo; Adis mundo'
eco ${cadena/'mundo'/'mundo!'}
# Imprime: Hola mundo!; Adis mundo
LOS SIGNOS #, ## Y %, %% EN LAS SUSTITUCIONES
La almohadilla ,-. se utiliza para identi%icar la b(squeda al comienzo de la cadena mientras que el porcentaje
,/., para identi%icarla al %inal.
0uando alguno de estos smbolos est" presente, se e"iminar$ de "a adena aquella %raccin coincidente con
e" patr#n de %&s'ueda)
${cadena!pa"ron}
Retorna cadena SIN patron
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
5
(na so"a a"mohadi""a o porenta)e, enontrar$ en "a adena "a parte m$s orta oinidente on e"
patr#n de b(squeda mientras que dos a"mohadi""as o porenta)es, "o har$n on "a ma*or +rai#n
coincidente. 1e esta %orma, si el patrn a buscar %uese) 2mun ,el asterisco se leera como cualquier cosa
siendo la e'presin completa) cualquier cosa hasta la slaba mun., una sola almohadilla encontrara
coincidencia en Hola mun, mientras que dos e'tenderan la coincidencia hasta Hola mundo; Adis mun)
cadena='Hola mundo; Adis mundo'
eco ${cadena#*mun}
do; Adis mundo
eco ${cadena##*mun}
do
Lo mismo sucede con el signo del porcentaje)
cadena='Hola mundo; Adis mundo'
eco ${cadena%mun*}
Hola mundo; Adis
eco ${cadena%%mun*}
Hola
#esumiendo, podramos decir que)
l porcentaje busca desde el %inal de la cadena
La almohadilla busca desde el principio
*mbos eliminan de la cadena, el patrn que coincida
3n solo signo, busca la menor coincidencia mientras que dos, buscan la mayor coincidencia
,a parte de "a adena 'ue es suprimida, puede ser sustituida con una sinta'is sumamente simple)
sustitucin${cadena#pa"ron}
${cadena%pa"ron}sustitucin
$or ejemplo)
cadena='Hola mundo; Adis mundo'
eco "*******"${cadena#*mun}
*******do; Adis mundo
cadena='Hola mundo; Adis mundo'
eco ${cadena%mun*}"*******"
Hola mundo; Adis *******
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
6
ste (ltimo sistema, nos puede servir para, por ejemplo, am%iar "a e!tensi#n de arhivos en masa)
#or arcivo in $H$%&/'()i#; do
eco *n '+enombrando '
basename $arcivo
mv $arcivo ${archivo%*i!}"p
done
4 por qu! no, para rear una opia de seguridad de los mismos)
#or arcivo in $H$%&/'()i#; do
eco *n ',reando copia de se)uridad para '
basename $arcivo
cp $arcivo ${archivo%*i!}'i!#bac$up'
done
SUBCADENAS Y SUSTITUCIN
n bash, tambi!n es posible e!traer una pori#n de una adena utilizando la siguiente sinta'is)
${cadena-posicion}
${cadena-posicion-lon)i"ud}
0on la primera, obtenemos la porcin desde posicion hasta el %inal mientras que con la segunda, la
obtenemos desde posicion hasta alcanzar la longitud indicada)
cadena='Hola mundo; Adis mundo'
eco ${cadena%&}
mundo; Adis mundo
eco ${cadena%&%&}
mundo
3tilizando el mismo m!todo anterior, tambi!n podramos simular una sustitucin)
cadena='Hola mundo; Adis mundo'
eco '*****'${cadena%&}
*****mundo; Adis mundo
eco '***'${cadena%&%&}'***'
***mundo***
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
7
&eniendo en cuenta que con ${#cadena} se obtiene la "ongitud tota" de una adena, podemos utilizar)
${#cadena}'cantidad para obtener una porcin calculando una determinada posicin desde el %inal)
cadena='Hola mundo; Adis mundo'
eco ${cadena-${#cadena}'((}
Adis mundo
CONTROL DE ARGUMENTOS
0uando escribimos guiones cuyos argumentos pueden ser opcionales, a veces establecemos valores por
de%ecto para los mismos. 5eguramente, en m"s de una oportunidad te habr"s encontrado haciendo lo
siguiente)
i# . $/ 0; "en
#ile1pa"=$/
else
#ile1pa"=$2&3A45617A6H
#i
5in embargo, bash dispone de una sinta'is mucho m"s simple para esto)
variable)${arumento%'*+,-./0-./123245-}
Ejemplo:
#ile1pa"=${/-*$2&3A45617A6H}
$ero lo anterior, es solo una de las tantas posibilidades que tenemos. * continuacin, veremos todas ellas con
mayor detalle.
USO Y ASIGNACIN DE PARMETROS POR DEFECTO
n bash, se pueden uti"i-ar va"ores por de+eto en di%erentes casos)
${variable'valor a usar si la variable no #ue de#inida}
${variable%'valor a usar si la variable no #ue de#inida o su valor es nulo}
Algunos Ejemplos:
eco ${#oo*89} # oo no est! deinida" Imprime: #$
#oo= # se deine oo con %alor nulo
eco ${#oo*:;} # &o imprime nada por'ue oo (a ue deinida en la l)nea anterior
eco ${#oo-*99} # Imprime: $$ (a 'ue oo ue deinida pero su %alor es nulo
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
8
ste m!todo es ideal para utilizar en el control de argumentos, cuando !stos, no son pasados al guin)
declare *r 2&3A45617A6H=/e"c/apace8/si"es*available
apace1pa"=${/-*$2&3A45617A6H}
n el ejemplo anterior, si no se pasa un argumento al guin, la variable apace1pa" toma como valor el de
la constante 2&3A45617A6H.
Vale aclarar que en todos los casos anteriores, el valor por defecto NO ES
ASIGNADO a la variable, solamente es UTILIZADO.
so signi%ica que ,retomando el ejemplo con la variable #oo. si posteriormente se quisiera imprimir la variable
6%oo, arrojara un valor nulo ya que nunca se le ha asignado uno)
eco ${#oo*<9} # Imprime: *$
echo $!oo # no imprime nada
$ero de ser necesario, tambi!n es posible asignar va"ores por de+eto utilizando el signo de igualdad en
vez del guin medio)
${variable)valor de variable si no #ue de#inida}
${variable%)valor de variable si no #ue de#inida o su valor es nulo}
eco ${#oo=89} # oo no est! deinida" Imprime: #$ asigna a oo el %alor #$
eco $#oo # Imprime: #$
#oo= # se deine oo con %alor nulo
eco ${#oo=:;} # &o imprime nada por'ue oo (a ue deinida" El %alor de oo no cam+ia
eco ${#oo-==:} # Imprime: ,- (a 'ue oo ue deinida pero su %alor es nulo"
# El %alor de oo se esta+lece en #$
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
9
RESUMEN DE BSQUEDAS Y SUSTITUCIONES EN BASH
..........................................................................................
BSQUEDA Y REEMPLAZO
..........................................................................................
${*+./+/6} +eemplaza la primera aparicin de A en >A+? por @
${*+.//+/6} +eemplaza "odas las apariciones de A por @ en >A+
..........................................................................................
CONTAR CARACTERES
..........................................................................................
${#*+.} +e"orna la lon)i"ud de >A+
..........................................................................................
EXTRACCIN
..........................................................................................
${*+.#0+5.-7} &limina la coincidencia mAs cor"a de 7A6+$B del comienzo de >A+
${*+.##0+5.-7} &limina la coincidencia mAs lar)a de 7A6+$B del comienzo de >A+
${*+.%0+5.-7} &limina la coincidencia mAs cor"a de 7A6+$B del #inal de >A+
${*+.%%0+5.-7} &limina la coincidencia mAs lar)a de 7A6+$B del #inal de >A+
..........................................................................................
SUBCADENAS
..........................................................................................
${*+.%0-8} +e"orna la porcin de >A+ desde 7$C as"a el #inal
${*+.%0-8%,27} +e"orna la porcin de >A+ desde 7$C as"a alcanzar la lon)i"ud 5&B
..........................................................................................
!ALORES POR DE"ECTO
..........................................................................................
${*+.'*+,-.} 4sar >A5$+ si >A+ no #ue de#inido
${*+.%'*+,-.} 4sar >A5$+ si >A+ no #ue de#inido o su valor es nulo
${*+.)*+,-.} Asi)nar >A5$+ a >A+ si >A+ no #ue de#inido
${*+.%)*+,-.} Asi)nar >A5$+ a >A+ si >A+ no #ue de#inido o su valor es nulo
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
10
SEGURIDAD INFORMTICA:
EUROPIOCODE, UN SISTEMA
DE CODIFICACIN DE
CARACTERES BASADO EN EL
MODELO SAC DE 3 CAPAS
CUNTAS VECES
ESCUCHAMOS Y REPETIMOS
LA FRASE NO EXISTEN LOS
SISTEMAS INVULNERABLES?
LO QUE NUNCA NOS
DETENEMOS A PENSAR ES
QUE SI NO EXISTEN, ES
SOLO PORQUE NO NOS
DETENEMOS A CREARLOS.
ENTONCES POR QU NO
COMENZAR A DESARROLLAR
SISTEMAS INVULNERABLES?
AQU LOS PRIMEROS PASOS
PARA ASEGURAR EL 60% DE
UN SISTEMA INFORMTICO.
ace poco m"s de un mes, liber! la versin beta 7 de
EuropioCode, un simple y sencillo sistema de
odi+iai#n de arateres %asado en seuenias
a"+anum.rias, el cual present! en el sitio 8eb de /e%ian
0a1ers
7
.
9
0odi%icar caracteres con secuencias al%anum!ricas, es la %orma m"s
con%iable de permitir al usuario, el ingreso de caracteres no
al%anum!ricos, sin poner en riesgo la seguridad de la aplicacin ni
limitar las %uncionalidades y prestaciones de la misma.
EuropioCode posee una doble capa de seguridad)
7. * nivel cliente ,librera :ava5cript.;
<. * nivel aplicacin ,librera $9$.;
stas dos capas de seguridad, son el complemento ideal para
2odSeurit*, con%ormando as un mode"o de seguridad SAC
(Server-Application-Client), &nio apa- de a"an-ar e" ma*or
nive" de seguridad, permitiendo sistemas in%orm"ticos
invulnerables.
ModSecurity, el mdulo de seguridad para
Apache, debe estar instalado con las reglas de
ncleo (core rules) creadas por OWASP.
7 http)==www.debianhac>ers.net=prevenir?ataques?'ss?e?inyecciones?de?
codigo?y?sql?con?europiocode
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
11
MODELO DE SEGURIDAD SAC
l modelo de seguridad 5*0 est" basado en una
triple capa de seguridad de @ niveles) 7. Servidor;
<. Ap"iai#n; y @. C"iente.
0omo modelo de seguridad, no solo es uno de los
m"s antiguos sino que adem"s es el (nico que
tradicionalmente ha sido capaz de otorgar
garant3as de invu"nera%i"idad so%re "os
sistemas in+orm$tios ?siempre que el modelo
sea implementado de la manera correcta?.
UN ERROR FRECUENTE EN SEGURIDAD
* pesar de todo lo anterior, e" mode"o de
seguridad SAC, generalmente solo es
implementado por grandes compaAas pero
su%estimado por "a ma*or3a de empresas *
personas independientes.
l desarro""ador 4e% que da sus primeros pasos
en la programacin, suele hacerlo desde una ptica
de usuario, entr$ndose so"o * &niamente en
"a seguridad de" "ado de" "iente, puesto que es
la (nica que el usuario %inal ,su cliente y en
de%initiva, !l mismo. puede percibir sin necesidad de
realizar los es%uerzos que el razonamiento deductivo
,al cual no est" acostumbrado. le demanden.
Lamentablemente, este tipo de incipientes
pro%esionales desarro""an apro!imadamente
entre e" 506 * e" 706 de "os sitios 4e% *
blogs de" merado.
Ms del 70% de los sitios Web
(excluyendo aplicaciones) solo
implementan seguridad del lado del
cliente.
Luego nos en%rentamos al promedio de los
programadores de nive" intermedio *
avan-ado, que con%iados de Bhaberlo visto todoC,
so"o se onentran en "a seguridad de "a
ap"iai#n, subestimando el control del lado del
cliente ,puesto que saben positivamente que el
mismo es per%ectamente vulnerable pero olvidan
que no por ello es in(til. y desconociendo los
mecanismos de abarcar la seguridad del lado del
servidor, por lo que la misma, la delegar"n en
terceros que generalmente tambi!n la desconocen o
no ponen en ella el es%uerzo mnimo necesario.
Duevamente debemos lamentarnos, ya que el
promedio de los programadores desarro""a
apro!imadamente e" 706 de "as ap"iaiones
de" merado.
El 80% de las aplicaciones Web
no cuenta con la seguridad
necesaria del lado del cliente ni
del servidor.
Einalmente nos encontramos con los
administradores de sistemas, quienes por lgica,
entrar$n su ateni#n en "a seguridad a nive"
servidor, delegando la tarea de programacin en
aplicaciones pre%abricadas que por lo general, han
sido desarrolladas por programadores promedio de
los que habl"bamos en el p"rra%o anterior. *qu nos
encontramos con que pr"cticamente el 7FF/ de los
administradores de sistemas, recurre a aplicaciones
pre%abricadas ,0G5. pero la buena noticia es que
por lo general, no lo hacen como servicio a terceras
personas o empresas y si lo hacen, no superan e"
86 de "os %"ogs de" merado ,enti!ndase que me
re%iero a los blogs que los administradores de
sistemas montan para las empresas para las cuales
trabajan y que no me estoy re%iriendo a los blogs
que montan para s mismos..
0on suerte, podremos encontrar un 206 de
ap"iaiones que imp"ementan e" mode"o de
seguridad SAC y sin embargo, una tercera parte
de estas, no lo implementa de la %orma m"s ptima.
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
12
MODSECURITY CORE RULES Y EL FIN DE LOS FALSOS POSITIVOS
9ace poco tiempo, conversando con mi colega de
ebian Hac!ers
"
/avid 0ern$nde-
@
, surga en
medio de la charla el tema sobre #los $alsos
positivos que el mdulo ModSecurity
4
de Apache
suele arro%ar&. 9ablando in%ormalmente,
coment"bamos nuestro BenojoC con los mismos
pero sin embargo, "a ma*or3a de "as vees "os
+a"sos positivos de 2odSeurit* son produto
de errores de dise9o a nive" de "a ap"iai#n.
s decir que "a ma*or3a de "as vees, no se trata
de +a"sos positivos.
* raz de esto, que me propuse hacer algo al
respecto y as naci EuropioCode.
EUROPIOCODE EN POCAS PALABRAS
EuropioCode no es m"s que un a"goritmo para
odi+iar adenas de arateres en #digo
a"+anum.rio %"cilmente decodi%icable y reversible.
sto, permite brindar al usuario la capacidad de
utilizar campos de %ormulario con te'to enriquecido
?hasta incluso, escribir cdigo %uente puro en
cualquier lenguaje? y enviar el mismo codi%icado
al%anum!ricamente, evitando as los %alsos positivos
de God5ecuity por supuestos intentos de ataques
de tipo SQL Injection o Cross Site Scripting
(XSS).
1e hecho, esta t.nia de odi+iai#n
a"+anum.ria N: se uti"i-a en s3 para evitar
+a"sos positivos en 2odSeurit* sino que por el
contrario, es "a +orma orreta de trans+erir
datos de +orma segura para prevenir ata'ues
por diversos tipo de inyecciones de cdigo.
< www.debianhac>ers.net
@ www.daboblog.com
H www.modsecurity.org
os !alsos positivos de Mod"ecurity
por intentos de ata#ues del tipo "$
%n&ection o 'ross "ite "cripting se
acaban evitando los errores de
dise(o en la aplicaci)n y esto se
logra* codi!icando las entradas del
usuario mediante alg+n sistema
al!anum,rico.
5i por ejemplo, se quiere permitir al usuario el
ingreso de comillas dobles, incluso aunque se las
reemplazase por su entidad 9&GL correspondiente
,Dquo";., sera un error de diseAo permitir su envo
en estado puro ,ya sea en su car"cter
correspondiente como en su entidad 9&GL. puesto
que t.niamente se estar3a permitiendo "a
in*ei#n de #digo en "a ap"iai#n, pues la
%orma correcta de permitir el ingreso de caracteres
especiales, jam"s puede contemplar la inyeccin de
cdigo.
5in embargo, si dej"semos que el usuario ingresara
esas comillas dobles pero nuestro sistema las
trans%ormase de %orma inmediata en cdigo
al%anum!rico ,que luego tuviese la capacidad de
interpretar y mostrar como al usuario como comillas
dobles., estaramos solucionando un requerimiento
sin poner en riesgo la seguridad de nuestro sistema.
ECODQUOT podra ser el equivalente
a las comillas dobles unicodes y
al quot; de HTML para nuestro &
sistema.
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
13
I eso, es lo que hace EuropioCode) trans%ormar los caracteres no al%anum!ricos en secuencias al%anum!ricas
que luego sea capaz de interpretar.
CODIFICACIN EUROPIO
*ntes de utilizar uropio0ode es muy importante saber que a(n se encuentra en %ase beta y solo contempla
un n(mero limitado de caracteres unicode, como se muestra en la tabla de la siguiente tabla.
TABLA DE CODIFICACIN DE CARACTERES UNICODE
4+.+452.
97:4-12
29.-0:-4-12
4+.+452.
97:4-12
29.-0:-4-12
0.23:;- 4<1:=- 893:;- 0.23:;- 4<1:=- 893:;-
!
&,$2E
::
&,$2,
"
&,$2E
:=
&,$2,
# :9 $ :F
% :< > :G
' :H ? =;
@ =/ * =8
A =: B ==
' =9 # =F
/ =< % 9G
C F; ) F/
D F8 E F:
F F= G H/
H H8 I H:
J H= / H9
K HF { /8:
L /8= } /89
M /8F N /8G
?espacio@ /F; /F/
O /F: P /</
Q /G; R /G:
S /G< T /H/
U /HH V 8:/
W /H: X 8;/
Y 8;9 < 8//
Z 8/G [ 88;
\ 8;H ] 889
^ 8:: _ 8:<
8=: ` 89;
a 898 b 8=/
?tabulado@ ;H c 9H
?salto de l_nea@ &,$2C
;a%"a de odi+iai#n a"+anum.ria de arateres
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
14
0omo se puede apreciar, la codi%icacin uropio0ode se basa en un pre+i)o ,&,$2E. y un su+i)o ,&,$2,.
predeterminados y entre medio, el n&mero 'ue on+orma e" #digo he!adeima" del car"cter
correspondiente. La (nica e'cepcin es el salto de lnea el cual es representado por el cdigo al%ab!tico
&,$2C(
La combinacin 0.23:;- A 7Zd2.- 12, 4<1:=- e2f+124:d+, A 893:;- es la que permite di%erenciar
al int!rprete, los caracteres al%anum!ricos intencionales del cdigo uropio.
TABLA DE CODIFICACIN DE ETIQUETAS PARA TEXTO CON FORMATO ENRIQUECIDO
La codi%icacin uropio est" preparada para admitir el %ormato de te'to enriquecido, %acilitando la codi%icacin
?y consiguiente decodi%icacin? de etiquetas 9&GL. $ara ello, todo te'to introducido que sea pre$ormateado
mediante etiquetas 9&GL, siempre que se permita, ser" convertido sobre la base del siguiente esquema)
25:g925+ e5d,
29.-0:-4-12
25:g925+ e5d,
29.-0:-4-12
7+&3IJ$ ,K2IE$ 7+&3IJ$ ,K2IE$
LbM
p3"
;; LolM
p3"
/8
Ls"ron)M ;/ LliM /:
LiM ;8 L/M /=
LemM ;: L8M /9
LuM ;= L:M /F
Ls"riNeM ;9 L=M /<
LsubM ;F L9M /G
LsupM ;< LFM /H
LpM ;G LcodeM 8;
LblocNquo"eM ;H LpreM 8/
LrM /; LbrM 88
LulM // LsmallM 8:
;a%"a de #digo Europio para te!to enri'ueido
1e la tabla anterior, se debe tener en cuenta que)
Dinguna de las etiquetas anteriores debe aceptar atributos;
5i una etiqueta 9&GL poseyera atributos, no sera interpretada como etiqueta de te'to enriquecido,
sino como caracteres no al%anum!ricos a ser codi%icados;
*quellas etiquetas que requieren una etiqueta e'tra de cierre, se codi%icar"n con los mismos cdigos
de la tabla anterior, pero antecediendo la vocal e al su%ijo ,p3";; ser" la codi%icacin de la etiqueta
LbM mientras que p3"e;; lo ser" para L/bM.
*simismo, se %acilita una odi+iai#n espeia" para eti'uetas 'ue de%an inde+eti%"emente aeptar
atri%utos, como es el caso particular de la etiqueta CaD ,ver tabla en la p"gina siguiente..
$or %avor, tener en cuenta que en caso de pretender codi%icar enlaces en %ormato 9&GL, solo ser" admitida la
siguiente sinta'is)
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
15
La re#=JurlJ' tar(et)*+blan!,+sel$,top*-Kanchor te'tL=aK
jemplos de en"aes v$"idos seran los siguientes)
La re#=Opa)ina("mlOM>isi"ar enlaceL/aM
La re#=O""p-//PPP(ducNducN)o(comOM@uscar en 2ucN2ucNEoL/aM
La re#=Opa)ina("mlO "ar)e"=JMsel%JM>isi"ar enlaceL/aM
La re#=O""p-//PPP(ducNducN)o(comO "ar)e"=JMblan>JM@uscar en 2ucN2ucNEoL/aM
5in embargo, ninguno de "os siguientes en"aes ser$n v$"idos omo ta"es)
La "ar)e"=JMsel%J re#=Opa)ina("mlOM>isi"ar enlaceL/aM
La re#=O""p-//PPP(ducNducN)o(comO "i"le=O@uscar en 2ucN2ucNEoOM@uscar en 2ucN2ucNEoL/aM
La re#=Opa)ina("mlO class=Omi1es"iloOM>isi"ar enlaceL/aM
TABLA DE CODIFICACIN DE CARACTERES EN HIPERVNCULOS
1entro de los hipervnculos, etiquetas y atributos son codi%icados sobre la base de los cdigos de la siguiente
tabla)
CA<AC;E< =
><(?: /E
CA<AC;E<ES
E(<:?@:C:/E
CA<AC;E< =
><(?: /E
CA<AC;E<ES
E(<:?@:C:/E
CA<AC;E< =
><(?: /E
CA<AC;E<ES
E(<:?@:C:/E
Ca hre!) aH;n8 taret)/ "E;n< ' )BFn/
# p;/n" M nB;n9 %// p6<n:
/ b@;n/ " null D
#6;Q/
C/aD e6;n/
1e esta %orma, el enlace)
La re#=O""p-//PPP(ducNducN)o(comO "ar)e"=JMblan>JM@uscar en 2ucN2ucNEoL/aM
En"ae on espaios en %"ano sin odi+iar ,NN Bytes.
sera codi%icado como)
aehni""pp5jnkPPPph(ntducNducN)oph(ntcomE/012345E/01/t=hnjblanN!5hl(@uscarE/012345E/01/enE/0
12345E/01/2ucN2ucNEoe5hn(
En"ae on espaios en %"ano odi+iado ,77O Bytes.
3n ejemplo similar, pero con enlaces sin espacios en blanco, se ve m"s compensado en la codi%icacin)
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
16
La re#=O""p-//PPP(ducNducN)o(comOM2ucN2ucNEoL/aM
En"ae sin espaios en %"ano antes de ser odi+iado ,P7 Bytes.
aehni""pp5jnkPPPph(ntducNducN)oph(ntcom!5hl(2ucN2ucNEoe5hn(
En"ae sin espaios en %"ano *a odi+iado ,Q7 Bytes ? un <F/ m"s.
0omo observacin, una %orma de optimizar la codi%icacin ,que me apunto como un 6$2$., sera que el cdigo
t=hnj, incluyera al espacio en blanco previo al atributo tar(et en la tabla de equivalencias para taret)/
USO DE EUROPIOCODE
$ara que codi%icar cadenas de te'to mediante uropio0ode no se convierta en una tarea tediosa, se puede
recurrir a las libreras :ava5cript ,cliente. y $9$ ,aplicacin. que codi%ican mediante uropio0ode teniendo
resueltas de antemano, todas las %uncionalidades necesarias.
5e puede obtener la (ltima versin del paquete completo de libreras, haciendo un branc del repositorio
o%icial en Launchpad
P
)
bzr branc lp-Reu)eniabai"/europiocode/"runN
$or %avor, notar que ,aunhpad utiliza Ba-aar
A
, el sistema de control de versiones desarrollado por
Canonia" que %orma parte o%icial del pro*eto >N(
5
.
EUROPIOCODE JS
europioBodeC)s https)==bazaar.launchpad.net=Reugeniabahit=europiocode=trun>=view=head)=europioMcode.js
La librera cliente, es un :ava5cript capaz de codi%icar grandes cadenas de te'to plano y te'to enriquecido.
5u uso, est" especialmente indicado para la codi%icacin de grandes "reas de te'to ,"eQ"area. en
%ormularios 9&GL.
La %orma de imp"ementai#n sugerida, es mediante la codi%icacin de dichos campos al ser invocado el
envo del %ormulario, es decir, en el evento onsubmi" tal como se muestra en el primer ejemplo de la p"gina
siguiente.
P https)==launchpad.net=
Q https)==www.gnu.org=so%tware=bazaar=
N https)==www.gnu.org=
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
17
PindoP(onload = #unc"ionST {
europiocode = neP &uropio,odeST;
documen"()e"&lemen"@UIdS'id/del/!ormulario'T(onsubmi" = #unc"ionST {
europiocode(encodeS'id/del/campo'T;
};
};
La librera :ava5cript posee dos m.todos de odi+iai#n)
&uropio,ode(encodeST
6ara codiicar te7to plano
&uropio,ode(encode/pre!ormatST
6ara codiicar te7to enri'uecido respetando eti'uetas de ormato
0ualquiera de las dos %unciones puede ser llamada en el evento onsubmi" y tras codi%icar el campo ,o los
campos. indicados, pasar"n a un estado de solo lectura antes de ser enviados.
+ale aclarar que pueden codi%icarse tantos campos como sea necesario. Do obstante se aconseja su uso con
precaucin, ya que "a odi+iai#n de" te!to no omprime e" tama9o de "as adenas, sino que act(an
de %orma contraria, insumiendo un mayor n(mero de bytes.
l siguiente, podra ser ejemplo de implementacin de uropio0ode :5 para codi%icar el %ormulario utilizado por
un 0G5 el cual es usado para agregar una nueva entrada a un blo(. l mismo, supone tres campos de te'to
de tipo "eQ"area con las S1) e"ique"as? NeUPords y en"rada-
PindoP(onload = #unc"ionST {
europiocode = neP &uropio,odeST;
documen"()e"&lemen"@UIdS'nueva1en"rada'T(onsubmi" = #unc"ionST {
europiocode(encodeS'e"ique"as'T;
europiocode(encodeS'NeUPords'T;
europiocode(encode1pre#orma"S'en"rada'T; 88 permite tags H9:;
};
};
EUROPIOCODE PHP
europioBodeCphp
https)==bazaar.launchpad.net=Reugeniabahit=europiocode=trun>=view=head)=europioMcode.php
$or el momento, solo se dispone de una librera o%icial a nivel aplicacin, desarrollada en $9$. $or ello, me
gustara invitar a programadores y programadoras de diversos lenguajes como $ython, $erl, #uby, :ava ,entre
otros., a motivarse y desarrollar una librera en el lenguaje de pre%erencia.
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
18
EuropioCode ?0? es capaz no solo de decodi%icar sino tambi!n de decodi%icar, revertir, limpiar y purgar una
cadena de te'to. $ero veremos esto en detalle para poder comprenderlo mejor.
2uropio4ode%%encode?@
Se aconseja su uso como refuerzo de seguridad en el envo de formularios.
Asimismo, se aconseja la persistencia de cadenas codificadas mediante
archivos de texto. Para persistencia en base de datos, ver ms adelante el
mtodo clean.
/odiica una cadena de te7to de la misma orma 'ue lo <ace la li+rer)a cliente"
=e puede utili>ar como reuer>o de la seguridad a ni%el aplicacin? (a 'ue todo lo 'ue se
implemente del lado del cliente? puede ser eludido con relati%a acilidad"
=u uso no aecta a una cadena 'ue (a se encuentre codiicada"
9so%
&uropio,ode--encodeSstring $cadenaT
.etorna%
5a cadena codi#icada
2"emplo de implementacin%
$inpu" = isse"S$17$C6.'inpu"'0T V &uropio,ode--encodeS$17$C6.'inpu"'0T - '';
#esultados obtenidos)
# Entrada del usuario: @+AHola :undo!@8+A
$inpu" = isse"S$17$C6.'inpu"'0T V &uropio,ode--encodeS$17$C6.'inpu"'0T - '';
prin" $inpu";
8*
Sa#ida$
E/01245E/01/+E/0124#E/01/HolaE/012345E/01/:undoE/012--E/01/E/01245E/01/E/012,*E/01/+E/0124#E
/01/
*8
2uropio4ode%%decode?@
Su uso est indicado solo para la lectura y decodificacin de texto
previamente codificado, preferentemente almacenado en un archivo de texto.
1ecodiica una cadena pre%iamente codiicada" ;a decodiicacin &0 se reali>a al estado
natural de la cadena antes de codiicarse? sino 'ue todos los caracteres no alanumBricos
pre%iamente codiicados? son con%ertidos a sus entidades H9:; <e7adecimales
correspondientes"
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
19
9so%
&uropio,ode--decodeSstring $cadenaT
.etorna%
5a cadena decodi#icada a en"idades H6%5
2"emplo de implementacin%
$encode1con"en" = #ile1)e"1con"en"sS'en"rada*/9<:'T;
$decode1con"en" = &uropio,ode--decodeS$encode1con"en"T;
#esultados obtenidos)
$encode1con"en" = #ile1)e"1con"en"sS'en"rada*/9<:'T;
prin" $encode1con"en";
8*
Sa#ida$
E/01245E/01/+E/0124#E/01/HolaE/012345E/01/:undoE/012--E/01/E/01245E/01/E/012,*E/01/+E/0124#E
/01/
*8
$decode1con"en" = &uropio,ode--decodeS$encode1con"en"T;
prin" $decode1con"en";
8*
Sa#ida$
C#45;+C#4#;HolaC#345;:undoC#--;C#45;C#,*;+C#4#;
*8
2uropio4ode%%decode/pre!ormat?@
Se aconseja su uso para lectura y decodificacin de archivos de texto
enriquecido previamente codificados con encode_preformat
1ecodiica una cadena de te7to enri'uecido? pre%iamente codiicada con encodeDpreormat"
;a decodiicacin &0 se reali>a completamente al estado natural de la cadena" =olo? se
decodiicar!n a estado natural? a'uellas eti'uetas H9:; permitidas"
9so%
&uropio,ode--decode1pre#orma"Sstring $cadenaT
.etorna%
5a cadena enriquecida decodi#icada
2"emplo de implementacin%
$encode1con"en" = #ile1)e"1con"en"sS'en"rada*/9<='T;
$decode1con"en" = &uropio,ode--decode1pre#orma"S$encode1con"en"T;
#esultados obtenidos)
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
20
$encode1con"en" = #ile1)e"1con"en"sS'en"rada*/9<='T;
prin" $encode1con"en";
8*
Sa#ida$
pEt55Eti'uetaE/012345E/01/admitidapEte55E/01=E/01245E/01/di%E/0124#E/01/Eti'uetaE/012345E/01
/noE/012345E/01/admitidaE/01245E/01/E/012,*E/01/di%E/0124#E/01/
En e%&ado na&'ra#( %e )'*ie%e +i%&o ,omo$
@+AEti'ueta admitida@8+A
@di%AEti'ueta no admitida@8di%A
*8
$decode1con"en" = &uropio,ode--decode1pre#orma"S$encode1con"en"T;
prin" $decode1con"en";
8*
Sa#ida$
@+AEti'uetaC#345;admitida@8+A
C#45;di%C#4#;Eti'uetaC#345;noC#345;admitidaC#45;C#,*;di%C#4#;
*8
2uropio4ode%%clean?@
Se aconseja su uso para almacenamiento persistente en bases de datos.
Elimina caracteres no alanumBricos de una cadena decodiicada? reempla>ando acentos?
cedillas ( %irgulillas de eFes de %ocales? ce ( eFes respecti%amente"
=u uso es especialmente Gtil para almacenar resGmenes de arc<i%os en una +ase de datos"
9so%
&uropio,ode--cleanSstring $cadenaT
.etorna%
5a cadena sin carac"eres no al#anumWricos
:mplementacin%
$encode1con"en" = #ile1)e"1con"en"sS'en"rada*/9<9'T;
$decode1con"en" = &uropio,ode--decodeS$encode1con"en"T;
$clean1con"en" = &uropio,ode--cleanS$decode1con"en"T;
#esultados obtenidos)
$encode1con"en" = #ile1)e"1con"en"sS'en"rada*/9<9'T;
prin" $encode1con"en";
8*
Sa#ida$
HnE/012345E/01/E/012#,3E/01/andE/012#$5E/01/E/012345E/01/'ueE/012345E/01/%i%E/012#-*E/01/aE/
012345E/01/enE/012345E/01/Ira>iliaE/012345E/01/seE/012345E/01/mudE/012#,-E/01/E/012345E/01/a
E/012345E/01/JaleE/012345E/01/doE/012345E/01/AE/012#-3E/01/o
En estado natural? se <u+iese %isto como:
Hn FandG 'ue %i%)a en Ira>ilia se mud a Jale do AKo
*8
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
21
$decode1con"en" = &uropio,ode--decodeS$encode1con"en"T;
prin" $decode1con"en";
8*
Sa#ida$
HnC#345;C##,3;andC##$5;C#345;'ueC#345;%i%C##-*;aC#345;enC#345;Ira>iliaC#345;seC#345;mudC##,-
;C#345;aC#345;JaleC#345;doC#345;AC##-3;o
*8
$clean1con"en" = &uropio,ode--cleanS$decode1con"en"T;
prin" $clean1con"en";
8*
Sa#ida$
Hn nandu 'ue %i%ia en Ira>ilia se mudo a Jale do Aco
*8
2uropio4ode%%pure?@
Se aconseja su uso para extraccin de palabras claves.
;impia una cadena decodiicada ( luego elimina pala+ras repetidas ( de longitud menor a -
caracteres" =u uso es especialmente Gtil para o+tener las pala+ras cla%es de un arc<i%o o
contenido determinado"
9so%
&uropio,ode--pur)eSstring $cadenaT
.etorna%
5a cadena limpiada U sin palabras repe"idas ni de lon)i"ud in#erior a : carac"eres
:mplementacin%
$encode1con"en" = #ile1)e"1con"en"sS'en"rada*/9<F'T;
$decode1con"en" = &uropio,ode--decodeS$encode1con"en"T;
$clean1con"en" = &uropio,ode--pur)eS$decode1con"en"T;
#esultados obtenidos)
$encode1con"en" = #ile1)e"1con"en"sS'en"rada*/9<F'T;
prin" $encode1con"en";
8*
Sa#ida$
HnE/012345E/01/E/012#,3E/01/andE/012#$5E/01/E/012345E/01/'ueE/012345E/01/%i%E/012#-*E/01/aE/
012345E/01/enE/012345E/01/Ira>iliaE/012345E/01/seE/012345E/01/mudE/012#,-E/01/E/012345E/01/a
E/012345E/01/JaleE/012345E/01/doE/012345E/01/AE/012#-3E/01/oE/012345E/01/por'ueE/012345E/01/
enE/012345E/01/Ira>iliaE/012345E/01/noE/012345E/01/<a+ita+aE/012345E/01/ningE/012#$5E/01/nE/
012345E/01/otroE/012345E/01/E/012#,3E/01/andE/012#$5E/01/E/012,4E/01/
En e%&ado na&'ra#( %e )'*ie%e +i%&o ,omo$
Hn FandG 'ue %i%)a en Ira>ilia se mud a Jale do AKo por'ue en Ira>ilia no <a+ita+a ningGn
otro FandG"
*8
$decode1con"en" = &uropio,ode--decodeS$encode1con"en"T;
prin" $decode1con"en";
8*
Sa#ida$
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
22
HnC#345;C##,3;andC##$5;C#345;'ueC#345;%i%C##-*;aC#345;enC#345;Ira>iliaC#345;seC#345;mudC##,-
;C#345;aC#345;JaleC#345;doC#345;AC##-3;oC#345;por'ueC#345;enC#345;Ira>iliaC#345;noC#345;<a+i
ta+aC#345;ningC##$5;nC#345;otroC#345;C##,3;andC##$5;C#,4;
*8
$clean1con"en" = &uropio,ode--pur)eS$decode1con"en"T;
prin" $clean1con"en";
8*
Sa#ida$
nandu 'ue %i%ia +ra>ilia mudo %ale aco por'ue <a+ita+a ningun otro
*8
2uropio4ode%%reverse?@
Se aconseja su uso SOLO Y NICAMENTE, previa modificacin del tipo MIME como
texto plano en los encabezados HTTP. Especialmente til, para ofrecer
descargas de cdigo fuente en estado puro. POR FAVOR, NO UTILIZAR ESTE MTODO
EN PRODUCCIN, SI SE CARECE DE CONOCIMIENTOS SOBRE SEGURIDAD INFORMTICA A
NIVEL SERVIDORES.
Juel%e una cadena codiicada a su estado puro tal como se encontra+a antes de la
codiicacin"
9so%
&uropio,ode--reverseSstring $cadenaT
.etorna%
5a cadena en es"ado ori)inal puro
:mplementacin%
$encode1con"en" = #ile1)e"1con"en"sS'sourcecode*8</G'T;
$decode1con"en" = &uropio,ode--decodeS$encode1con"en"T;
eaderSO,on"en"*6Upe- "eQ"/"eQ"; carse"=u"#*GOT;
prin" &uropio,ode--reverseS$decode1con"en"T;
#esultados obtenidos)
$encode1con"en" = #ile1)e"1con"en"sS'sourcecode*8</G'T;
8*
Con&enido de# ar,)i+o$ %o'r,e,ode-./01
E/01245E/01/E/0124-E/01/p<pE/01=E/01=unctionE/012345E/01/ooE/012,5E/01/E/012-4E/01/paramE/
01243E/01/&H;;E/012,3E/01/E/012345E/01/E/0123#-E/01/E/01=E/012345E/01/E/012345E/01/E/012345E
/01/E/012345E/01/iE/012,5E/01/E/012--E/01/isE/012L$E/01/nullE/012,5E/01/E/012-4E/01/paramE/
012,3E/01/E/012,3E/01/E/012345E/01/returnE/012345E/01/splitE/012,5E/01/E/012-4E/01/paramE/01
2,,E/01/E/012345E/01/c<rE/012,5E/01/35E/012,3E/01/E/012,3E/01/E/012$LE/01/E/01=E/0123#$E/01/
E/01=E/01=E/0124-E/01/E/0124#E/01/
*8
$decode1con"en" = &uropio,ode--decodeS$encode1con"en"T;
8*
C#45;C#4-;p<p
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
23
unctionC#345;ooC#,5;C#-4;paramC#43;&H;;C#,3;C#345;C#3#-;
C#345;C#345;C#345;C#345;iC#,5;C#--;isC#L$;nullC#,5;C#-4;paramC#,3;C#,3;C#345;returnC#345;sp
litC#,5;C#-4;paramC#,,;C#345;c<rC#,5;35C#,3;C#,3;C#$L;
C#3#$;
C#4-;C#4#;
*8
eaderSO,on"en"*6Upe- "eQ"/"eQ"; carse"=u"#*GOT;
prin" &uropio,ode--reverseS$decode1con"en"T;
8*
Sa#ida$
@Mp<p
unction ooNOparam.&H;;P Q
iN!isDnullNOparamPP return splitNOparam? c<rN35PP;
R
MA
*8
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
24
INGENIERA INVERSA: SOLO
EL QU PUEDE DESVELAR
EL CAMINO HACIA EL
CMO
LA INGENIERA INVERSA
APLICADA AL DESARROLLO
DE SOFTWARE NO ES NI
FCIL NI DIFCIL. SU
SENCILLEZ PUEDE RESULTAR
COMPLICADA O SU
COMPLEJIDAD PUEDE
RESULTAR SENCILLA,
DEPENDIENDO DE CADA
PERSONA. POR LO TANTO,
SE DESACONSEJA LA
IMPLEMENTACIN DE LAS
TCNICAS AQU EXPUESTAS,
SI AL ESTUDIAR ESTE
PAPER SE EXPERIMENTA LA
SENSACIN DE ESTAR
DESCUBRIENDO ERRORES,
PUESTO QUE LA MISMA ES
INDICIO DE UNA
COMPRENSIN INCORRECTA
QUE PODRA LLEVAR A LA
ADQUISICIN DE MALAS
PRCTICAS .
uando la ingeniera inversa se aplica para el desarrollo de
so%tware, suele ser %recuente que el programador comience
el diseAo de la aplicacin anticipando el cmo la
desarrollar", sin haber evaluado previamente qu! es lo que de sea
lograr. 5in dudas, esto es "o 'ue m$s tra%a)o uesta a "os
programadoresD entender Ee" 'u.F * di+ereniar"o de"
E#moF.
0
* di%erencia de la Sngeniera Snversa de hardware, "a +#rmu"a de "a
@ngenier3a @nversa para e" desarro""o de So+tGare no consiste
(nicamente en seguir una serie de pasos. $or el contrario, cada
paso a seguir onsiste en, paradjicamente, analizar y deduir
u$"es son -)ustamente- "os pasos a seguir.
La mejor forma de organizar el desarrollo es
efectuar el anlisis de requerimientos por
medio de Historias de Usuarios
4rganizar el an"lisis de requerimientos mediante 9istorias de
3suarios, es el primer paso para comprender primero 'u. es "o
'ue se desea "ograr.
"i no se sabe con exactitud #u, resultado se
espera ver* no -ay !orma posible de -acer una
evaluaci)n #ue indi#ue si vamos o no por el
camino correcto.
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
25
3na 9istoria de 3suario, en s misma es un objetivo a alcanzar. 5in embargo, e" programador on+unde e"
o%)etivo en s3 mismo, on e" #mo ese o%)etivo de%e ser a"an-ado. $ero para entenderlo mejor,
ve"moslo con un ejemplo.
5upongamos que tenemos la siguiente 9istoria de 3suario)
#Como administrador puedo a(re(ar nuevas cate(oras al cat.lo(o de productos&
Do interesa si se est" programando orientado a objetos o no o si es mejor implementar un paradigma u otro.
Lo que nos interesa ahora es entender cu"l es el objetivo. I a di%erencia de lo que la mayora de los
programadores creera, el (nico objetivo que se encuentra inicialmente es Einsertar nuevas ategor3as a
un at$"ogo de produtosF el cual se supone implcitamente, que ya e'iste.
ntonces, lo que se espera ver es una nueva ategor3a dentro de" sitio donde e" meanismo de
persistenia e"egido ,una base de datos, por ejemplo. a"maene "a in+ormai#n.
&eniendo en claro qu! es e'actamente lo que se espera ver, reci!n all es cu"ndo se debe comenzar a pensar
en cmo lograrlo.
sto necesariamente implica tener que onvertir un o%)etivo en e" proedimiento neesario para
a"an-ar e" siguiente o%)etivo. 1e eso se trata la ingeniera inversa. 0ada objetivo debe ser a la vez,
convertido en su propio cmo y este (ltimo, debe arrojar el siguiente objetivo.
$or ejemplo, si insertar categoras es un objetivo, el cmo nos lo tiene que dar el propio objetivo. TUu!
signi%ica estoV Uu! lo primero que debemos hacer es insertar esas categoras tan manualmente como sea
posible. sto es Wtrans%ormar el objetivo en un cmo alcanzarloX. 5uponiendo que trabajamos
proceduralmente ,a %in de no enredar a los menos e'pertos con cuestiones inherentes a la programacin
orientada a objetos. y la base de datos %uese nuestro mecanismo de persistencia, necesitaramos una %uncin
que guardase una categora en la base de datos.
Cuando te cueste hallar el qu, escribe un caso de uso. Eso te ayudar a
encontrarlo ms fcilmente.
$or ejemplo, podemos citar como caso de uso, el administrador que agrega la categora llamada
BlectrnicaC. ntonces Tqu! debemos hacerV scribir el mnimo cdigo necesario para insertar la categora
BlectrnicaC en la base de datos ,recordemos que el objetivo %ue trans%ormado en el cmo alcanzarlo.)
%unction agregarMcategoria,. Y
/ e$inir el quer0
6sql Z JSD5#& SD&4 categorias ,categoriaMid, denominacion. +*L35 ,D3LL, V.J;
/ Asi(namos los datos manualmente (hardcodeamos)
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
26
6data Z array,JsJ, JE"etr#niaJ.;
/ 1%ecutamos la consulta
6categoriaMid Z 1BLayer))ejecutar,6sql, 6data.;
/ retornamos el resultado de la e%ecucin a $in de constatar que la misma ha0a sido e$ectiva
return 6categoriaMid;
[
/ 2nvocamos a la $uncin 0 probamos que $uncione3 es decir3 corroboramos que se a(re(ue la denominacin 1lectrnica
/ en la tabla cate(orias
print agregarMcategoria,.;
0omo se puede observar, simplemente nos limitamos a)
7. @denti+iar e" primer o%)etivoD agregar una nueva categora;
<. A"an-ar e" o%)etivoD convertimos el objetivo en una accin concreta que nos dice como alcanzar el
objetivo ,insertar un nuevo registro en la tabla categoras.
3na vez hecho esto, se veri%ica que %unciona. 5i %alla, se corrige tantas veces como sea necesario hasta lograr
que %uncione.
Nunca intentes adivinar un error. Utiliza el log de errores para saber por
qu ha fallado algo.
*hora, se busca un nuevo objetivo. *ntes, habamos dicho que Wel cmo de un objetivo tambi!n debera ser
quien nos arroje el siguiente objetivoX. Siempre despu.s de hardcodear a"go, e" o%)etivo siguiente es
e"egir una parte de" #digo para de)ar de hardcodear. l ciclo se repite hasta que ya no quede nada que
necesite dejar de ser hardcodeado. n nuestro caso, estamos insertando a mano, la denominacin de la
categora desde el propio cdigo. Duestro objetivo debera estar relacionado a Wdejar de insertar a mano la
denominacin de la categoraX.
5e debe ser sumamente cuidadoso ya que aqu suelen aparecer gran parte de las complicaciones.
4bviamente nuestro objetivo es hacer que el valor del campo denominacion sea variable ,por %avor, notar
que cito como objetivo que el campo 5* +*#S*BL pero en ning(n momento menciono algo como Wque valor
sea ingresado mediante un %ormularioX, es decir, no hablo de cmo lograrlo ni mucho menos, me planteo
objetivos ambiciosos con respecto a lo que ya he alcanzado..
l cmo lograrlo, puede variar de programador en programador y cada uno tendr" ideas di%erentes. $ero
siempre debe establecerse como regla principal, esri%ir e" m3nimo #digo neesario.
n este caso puntual, se me ocurre una sola alternativa) para que un valor sea variable, lo de%ino en una
variable ,recurro a lo m"s simple, es decir, busco lo obvio que en de%initiva no es m"s que convertir al objetivo
en un cmo.. *hora mi objetivo, es de%inir el valor de una categora en una variable ,el cmo se trans%orma en
el siguiente objetivo.. I se me ocurren ?en principio? dos %ormas de lograrlo)
7. 1e%inir la variable dentro de la %uncin;
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
27
<. $asar el valor como par"metro;
Erente a dos o m"s alternativas, se debe aplicar siempre el principio de la Davaja de 4c>ham, el cual dice que)
"a so"ui#n m$s simp"e sue"e ser "a m$s pro%a%"e ,aunque no necesariamente la correcta.. $ara ello,
debo analizar y comparar las alternativas.
5i de%iniera la variable dentro de la %uncin y quisiera, por ejemplo, insertar @ categoras, debera editar el
archivo @ veces y ejecutarlo @ veces, mientras que pasando el valor como par"metro, podra invocar a la
%uncin @ veces. 0omo esta (ltima requiere menor es%uerzo ,y el es%uerzo re%leja la complejidad de algo., la
elijo)
%unction agregarMcategoria,Hdenominaion. Y
6sql Z JSD5#& SD&4 categorias ,categoriaMid, denominacion. +*L35 ,D3LL, V.J;
6data Z array,JsJ, JHdenominaionJ.;
6categoriaMid Z 1BLayer))ejecutar,6sql, 6data.;
return 6categoriaMid;
[
print agregarBategoriaIJKuguetesJL;
print agregarBategoriaIJMerreter3aJL;
print agregarBategoriaIJBa-arJL;
* pesar de todo, sigo hardcodeando los datos ,aunque ya un poco menos que antes.. *hora, lo que debo
lograr es que el valor de la categora, no sea escrito manualmente en el archivo. La (nica %orma de lograr mi
nuevo objetivo, es hacer que el usuario lo ingrese. 5eguramente, esto sea uno de los criterios de aceptacin
de la 93. Sncluso, hasta debe mencionar que deber" hacerse mediante un %ormulario. $ero a(n, no he llegado
a los criterios de aceptacin, as que omitir! pensar en ellos ,incluso cuando los conozca..
Omite pensar en aquellas restricciones a las que an no haz llegado. Deja que
el cdigo te gue. De lo contrario, no estars implementando la ingeniera
inversa sino la tradicional.
$ara que el usuario ingrese dicho valor podra hacerlo mediante dos m!todos ,$45& o \&.. 5! que $45& es el
m"s seguro pero implicara mucho es%uerzo) crear un %ormulario 9&GL y la %uncin que lo muestre o crear una
%uncin utilizando c3#L para enviar los datos, lo cual implicara escribirlos a mano nuevamente o enviarlos
mediante \&, recogerlos y enviarlos con c3#L mediante $45&. 1G*5S*14 complicado. $asarlo por \& ,y
listo. resulta mucho m"s sencillo. I como bien dijimos, no debemos ,ahora. pensar en restricciones %uturas.
*(n no hemos llegado a la seguridad de la aplicacin ni a los criterios de aceptacin, pues entonces, adelante
con utilizar el m!todo \&.
La %uncin no cambiar"; solo lo har" la %orma en la que !sta ser" invocada)
print agregarMcategoria,HB>E;NJategoriaJO.;
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
28
+uelvo a probar, simplemente modi%icando el valor del par"metro en la 3#S tantas veces como lo desee)
]...categorias.phpVcategoriaZSndumentaria
]...categorias.phpVcategoriaZ1eportes
]...categorias.phpVcategoriaZ:ardinera
]...categorias.phpVcategoriaZEarmacia
3na vez que ya se ha eliminado todo dato hardcodeado, puedo pasar a los criterios de aceptacin.
Por favor, notar que hasta aqu, hemos comenzado el desarrollo por el final,
es decir, por cumplir el primer objetivo el cual es la Historia de Usuario en
s mismo. Esto, justamente, es aplicar la Ingeniera Inversa.
ntre los criterios de aceptacin de esta 9istoria de 3suario, por lo general, suelen encontrarse varios que
hacen re%erencia a las restricciones sobre los datos a agregar. 1esde algunos que mencionan cantidades
mnimas y m"'imas de caracteres hasta otros que nos dicen qu! hacer si se intentan incluir datos duplicados.
.en en cuenta #ue cada criterio de aceptaci)n ser un ob&etivo
sto signi%ica que debemos tomar uno ?y solo uno? incluso aunque parezca WpocoX. $or ejemplo, imaginemos
que entre los criterios de aceptacin encontramos los siguientes)
Cate(ora con menos de 4 caracteres retorna mensa%e 1l nombre de la cate(ora debe tener al menos 4 caracteres
sin incluir los espacios en blanco
Cate(ora con m.s de 45 caracteres retorna mensa%e 1l nombre de la cate(ora no puede contener m.s de 45
caracteres inclu0endo espacios en blanco
etc6666
E)emp"o de Criterios de Aeptai#n
Lgicamente habr" muchos criterios de aceptacin m"s, pero se de%e e"egir so"o uno de ellos ?sin
e'cepcin? para continuar el desarrollo y sobre el elegido, se repetir"n todos los procedimientos anteriores.
$ara que no queden dudas sobre cmo aplicar Sngeniera Snversa al desarrollo de 5o%tware, propongo un
ejercicio sencillo que a mis alumnos suele ayudarlos a esclarecer toda duda. 5e trata de desarrollar una
librera ,o script. que retorne una cadena de te'to aleatoria ,a modo de contraseAa. con las siguientes
caractersticas)
1ebe tener al menos 7 letra may(scula, 7 min(scula, 7 n(mero y 7 car"cter no al%anum!rico
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
29
5u longitud debe ser de O caracteres
l orden de aparicin de los caracteres debe ser aleatorio ,es decir que no puede cumplir un patrn.
0omo (nica ayuda dir! que)
5e debe comenzar hardcodeando el resultado. $or ejemplo, comenzar retornando una contraseAa a
modo de ejemplo, que cumpla con los requisitos anteriores) a+(#+(a)
1el retorno anterior, ir sustituyendo los caracteres hardcodeados de a uno por vez respetando el
patrn del retorno inicial y dejando para el %inal, la WmezclaX de caracteres para evitar patrones.
5i sigues los pasos mencionados y no te dejas llevar por suposiciones ni por in%ormacin que no est! e'plcita,
lograr"s entender por completo el procedimiento para desarrollar 5o%tware aplicando Sngeniera Snversa.
Contratando un P?S on e" en"ae de esta pu%"iidad, me a*udas a mantener ;he :rigina" 0a1er DL
Servidores a solo (S/ 8 = mes)
20 >B de disco
1iscos SS/
7 &B de trans%erencia
812 GB <A2
@nsta"ai#n en menos de 1J
lige (%untu Server 12C04 ,;S y despreoc(pate de
la seguridad, optimiz"ndolo con Ka1;heStripper
Luego de instalarlo, on+ig&ra"o on Ka1;heStripper) eugeniabahit.com=proyectos=jac>thestripper
Contratando on este en"ae, me a*udas a mantener ;he :rigina" 0a1erD http)==bit.ly=promo?digitalocean
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
30
INGENIERA DE SOFTWARE:
WRAPPERS Y DECORADORES
EN PYTHON
EN EL MUNDO DE LA
INGENIERA DE SISTEMAS,
PYTHON ES UNO DE LOS
LENGUAJES MS TEMIDOS Y
RESPETADOS. EL RESPETO,
NO ES ALGO QUE DEBA
PERDERSE, PERO EL MIEDO,
DEBERA SER ERRADICADO.
Y ESO, ES LO QUE
PRETENDO LOGRAR CON ESTA
SERIE DE DOS ENTREGAS:
OTORGAR UNA EXPLICACIN
CLARA, SIMPLE Y
DEFINITIVA SOBRE LOS 4
MONSTRUOS DEL
LENGUAJE. EN LA ENTREGA
FINAL, WRAPPERS Y
DECORADORES.
n la edicin anterior de &he 4riginal 9ac>er, se hizo una
e'plicacin pro%unda y detallada sobre las %unciones
lambda y los closures dejando pendientes los wrappers y
decoradores para esta entrega. I de poner a los 7rappers y
decoradores en blanco sobre negro, es que nos encargaremos
ahora.

*ntes de comenzar es necesario entender que)


7. Do se puede hablar de 7rappers sin haber entendido
previamente qu! son los closures. $or lo tanto, si no lo haz
hecho a(n, te recomiendo leer las p$ginas 8 a 7 de ;he
:rigina" 0a1er NQ3, edicin que puedes obtener en
http)==library.originalhac>er.org=biblioteca=revista=ver=7^
<. Do se puede hablar de decoradores sin hablar de wrappers,
puesto que b"sicamente ambos t!rminos hacen re%erencia a
lo mismo, pero con una sutil di%erencia a nivel terico?
conceptual.
*clarado esto, estamos en condiciones de continuar con lo nuestro.
Lo primero que debemos recordar, es que un closure es una
+uni#n 'ue dentro de e""a ontiene a otra +uni#n la cual es
retornada cuando el closure es invocado)
de# closureSparame"ro/T-
de# #uncionSparame"ro8T-
prin" parame"ro/ X parame"ro8
re"urn #uncion
#oo = closureS/;T ! #oo aora es la #uncin in"erna del closure
prin" #ooS8;;T # Imprime: #35
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
31
prin" #ooS9;;T # Imprime: $35
No olvides repasar el artculo sobre closures publicado en The Original
Hacker N3: http://library.originalhacker.org/biblioteca/revista/ver/19
(n deorador ,decorator., es a'ue" closure 'ue omo par$metro rei%e a una +uni#n I""amada
+uni#n RdeoradaSL omo &nio argumento)
de# decoradorS#uncion1decoradaT-
de# #uncionST-
pass
re"urn #uncion
Gientras que un wrapper no es m"s que la +uni#n interna de un closure 'ue a "a ve- sea de tipo
deorador ,%uncin a la que en los ejemplos anteriores llamamos W%uncionX a secas.)
de# decoradorS#uncion1decoradaT-
de# mrapperST-
pass
re"urn Prapper
La +uni#n deorada deber" ser invocada por el 7rapper)
de# decoradorS#uncion1decoradaT-
de# PrapperST-
return !uncion/decorada?@
re"urn Prapper
l decorador no se invoca como una %uncin normal. _ste es llamado con una sinta'is especial)
Ydecorador
La sinta'is anterior se debe colocar en la lnea anterior a la de%inicin de la %uncin decorada. 1e esta %orma,
el nombre de la %uncin decorada es pasado como par"metro de %orma autom"tica sin tener que invocar nada
m"s)
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
32
Fdecorador
de# #uncion1decoradaST-
prin" 'CoU una #uncin decorada'
9asta aqu entonces, tenemos que)
3n closure es una %uncin que dentro de ella de%ine otra %uncin.
3n deorador es un closure que recibe una %uncin como par"metro.
3na +uni#n deorada es la que se pasa como par"metro a un decorador.
3n wrapper es la %uncin interna del decorador, encargada de retornar a la %uncin decorada.
CMO FUNCIONAN Y SE ACCIONAN LOS WRAPPERS Y
DECORADORES?
0uando una %uncin es decorada, el decorador se acciona de %orma autom"tica en el momento que el script es
ejecutado)
#!8usr8+in8en% p(t<on
de# decoradorS#uncionT-
prin" 'CoU el decoradorST'
de# PrapperST-
prin" 'CoU el PrapperST'
re"urn #uncionST
re"urn Prapper
Ydecorador
de# #uncion1decoradaST-
prin" 'CoU la #uncion1decoradaST'
*l ejecutar este script 5SD haber invocado ninguna %uncin, podemos ver como el decorador ya ha actuado)
eu)eniaYcococa*)nuci"a-R/borrador$ (/#oo(pU
8on el decorador?@
eu)eniaYcococa*)nuci"a-R/borrador$
0uando la %uncin decorada es invocada, el decorador ya la habr" reemplazado por el 7rapper, retornando a
!ste en lugar de la %uncin original, es decir, retorna al 7arpper en lugar la %uncin decorada, tal como
muestra el siguiente ejemplo)
#!8usr8+in8en% p(t<on
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
33
de# decoradorS#uncionT-
prin" 'CoU el decoradorST'
de# PrapperST-
prin" 'CoU el PrapperST'
# return uncionNP
re"urn Prapper
Ydecorador
de# #uncion1decoradaST-
prin" 'CoU la #uncion1decoradaST'
!uncion/decorada?@
l resultado de la ejecucin del script ser" el siguiente)
eu)eniaYcococa*)nuci"a-R/borrador$ (/#oo(pU
8on el decorador?@
8on el mrapper?@
eu)eniaYcococa*)nuci"a-R/borrador$
0omo bien puede verse, al haber invocado a #uncion1decoradaST, no %ue !sta quien se ejecut sino que ha
sido la %uncin PrapperST.
$ero, tal y como se dijo al comienzo, el 7rapper ser" quien tras su ejecucin, invoque a la %uncin decorada)
#!8usr8+in8en% p(t<on
de# decoradorS#uncionT-
prin" 'CoU el decoradorST'
de# PrapperST-
prin" 'CoU el PrapperST'
return !uncion?@
re"urn Prapper
Ydecorador
de# #uncion1decoradaST-
prin" 'CoU la #uncion1decoradaST'
!uncion/decorada?@
l resultado ahora, ser" el siguiente)
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
34
eu)eniaYcococa*)nuci"a-R/borrador$ (/#oo(pU
8on el decorador?@
8on el mrapper?@
8on la !uncion/decorada?@
eu)eniaYcococa*)nuci"a-R/borrador$
l orden de e)eui#n en wrappers * deoradores se puede establecer como el siguiente)
7. deorador ,autom"ticamente al ejecutar el script reemplazando la %uncin decorada por el 7rapper.
<. wrapper ,al invocar a la %uncin decorada.
@. +uni#n deorada ,luego de ejecutarse el 7rapper.
/uede decirse entonces #ue conceptualmente* un decorador es un
closure que se encarga de reemplazar a la funcin decorada por su
funcin interna, a la cul se denomina wrapper
PARA QU USARAMOS UN WRAPPER?
n primer lugar, notar"s que la pregunta D4 ha sido para qu! usar un decorador, sino para que usar un
7rapper. sto es debido a que la respuesta a para qu! utilizar un decorador es %"cilmente deducible) para
implementar un 7rapper.
Los 7rappers o envo"turas, suelen utilizarse cuando se tienen %unciones que *D&5 de ejecutar su verdadera
%uncionalidad, realizan acciones redundantes. 3n ejemplo muy tpico, es cuando se utilizan bloques "rU y
eQcep")
de# )e"1"empla"eST-
trn%
Pi" openS'"empla"e("ml'? 'r'T as arcivo-
re"urn arcivo(readST
elcept%
re"urn '&++$+ IB6&+B$'
de# calcularSpar"es=;? "o"al=/;;T-
trn%
re"urn "o"al / par"es
elcept%
re"urn '&++$+ IB6&+B$'
0omo podemos ver, tenemos dos %unciones que utilizan bloques try y e'cept ,generalmente, se tienen
muchsimas m"s.. 3na %orma de manejar los errores en estas %unciones, sera utilizar un wrapper)
de! intentar?!uncion@%
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
35
# Hsamos *args ( **STargs (a 'ue tenemos una uncin 'ue necesita argumentos
de# PrapperS'ar)s? ''NPar)sT-
"rU-
re"urn #uncionS'ar)s? ''NPar)sT
eQcep"-
re"urn '&++$+ IB6&+B$'
re"urn Prapper
1e esta %orma, solo deberamos decorar a las %unciones que anteriormente utilizaban los bloques "rU y
eQcep")
Fintentar
de# )e"1"empla"eST-
Pi" openS'"empla"e("ml'? 'r'T as arcivo-
re"urn arcivo(readST
Fintentar
de# calcularSpar"es=;? "o"al=/;;T-
re"urn "o"al / par"es
5i invoc"ramos a calcular con los argumentos por de%ecto, se producira un error al intentar dividir por cero,
pero sera manejado por el 7rapper)
eu)eniaYcococa*)nuci"a-R/borrador$ (/bar(pU
2..-. :752.7-
eu)eniaYcococa*)nuci"a-R/borrador$
Erecuentemente, lo mismo que sucede con el mane)o de errores en cuanto a acciones repetidas en distintas
%unciones, suele darse con acciones como el ontro" de aeso ,usado por ejemplo, para veri%icar si un
usuario tiene permisos su%icientes antes de e%ectuar una determinada accin. o el registro de atividades
,conocido como lo((in(..
3n uso menos %recuente aunque paradjicamente podramos mencionarlo como imprescindible, es para el
ontro" de datos mediante +i"tros de saneamiento o de tratamiento, como se muestra en el siguiente
ejemplo 8eb para $ython sobre *pache con 85\S)
de# )e"1pos"1da"aS#uncionT- # decorador
de# PrapperSenvironT- # claramente este es el Trapper del decorador
17$C6 = {}
"rU-
da"os = environ.'Ps)i(inpu"'0(readST(spli"S'D'T
#or par in da"os-
NeU? value = par(spli"S'='T
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
36
17$C6.NeU0 = unquo"eSvalueT(replaceS'X'? ' 'T
NeU? value = SBone? BoneT
eQcep"-
pass

re"urn #uncionS17$C6T # retorna a la uncin decorada una %e> termina lo anterior
re"urn Prapper
Fet/post/data # ##amada a# de,orador
de# )uardarS7$C6T- # uncin decorada
nombre = 7$C6.'nombre'0
apellido = 7$C6.'apellido'0
# """
Fet/post/data # ##amada a# de,orador
de# ac"ualizarS7$C6T- # uncin decorada
pass
Fet/post/data # ##amada a# de,orador
de# eliminarS7$C6T- # uncin decorada
pass
0omo puede verse en el ejemplo anterior, la llamada al decorador es una sinta'is abreviada equivalente a)
et/post/data?uardar@
de# )uardarS7$C6T-
nombre = 7$C6.'nombre'0
apellido = 7$C6.'apellido'0
# """
et/post/data?actualizar@
de# ac"ualizarS7$C6T-
pass
et/post/data?eliminar@
de# eliminarS7$C6T-
pass
5in embargo, la nueva sinta'is propuesta por la incorporacin de decoradores, hace la lectura del cdigo
%uente mucho m"s simple.
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
37
EUROPIOENGINE LAB:
SECURITYLAYER, UNA CAPA
DE SEGURIDAD INTELIGENTE
ESTE PAPER ES LA
CONTINUACIN DE LA
INVESTIGACIN INICIADA EN
EL ARTCULO CAPAS DE
SEGURIDAD INTELIGENTES EN
PHP Y SANEAMIENTO
AUTOMTICO DEL ARRAY
POST PUBLICADO EN THE
ORIGINAL HACKER N2.
TODO LO EXPLICADO
ANTERIORMENTE, SE HA
IMPLEMENTADO EN UNA CAPA
DE SEGURIDAD PARA
EUROPIO ENGINE TAL COMO
SE COMENTA A
CONTINUACIN.
n par de ediciones atr"s, escriba un artculo sobre cmo
gestar una capa de seguridad inteligente que saneara de
%orma autom"tica el arra0 super(lobal $17$C6. 5i deseas,
puedes obtener mis notas sobre el tema visitando el siguiente
enlace) http)==library.originalhac>er.org=biblioteca=articulo=ver=7<F
3
$arte de la investigacin, consisti en ir intentando implementar el
resultado obtenido de cada estudio, en una capa de seguridad para
uropio ngine. La misma %ue agregada como plu(in.
$uede verse el cdigo %uente completo ,incluidos los test.
ingresando en el repositorio o+iia" de Europio Engine)
https)==bazaar.launchpad.net=Reugeniabahit=europioe'perimental=tr
un>=%iles=O=common=plugins=securitylayer
Do obstante, antes de que decidas abarcar el cdigo de dicha capa
de seguridad, veamos cmo %unciona para que puedas llegar al
cdigo con mayor in%ormacin.
ATENCIN: para seguir los ejemplos, recomiendo trabajar con un branch
actualizado del repositorio. Para obtener un branch, ejecuta:
bzr branc lp-europioeQperimen"al
$ara hacer las pruebas, cre! un mdulo llamado pruebas)
cd core/cli
(/europio *c pruebas
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
38
I dentro del mdulo, agregu! el modelo demo)
(/europio *# pruebas 2emo
*gregu! un %ormulario simple en la vista utilizando el plu(in Zeb3orm y para no tener que completarlo
manualmente, le insert! los valores de prueba por de%ecto)
# Arc<i%o: appmodules8prue+as8%ieTs8demo"p<p
public #unc"ion a)re)arST {
$#orm = neP Zeb3ormS'/prueba/demo/)uardar'T;
$#orm*Madd1"eQ"S'email'? B455? '[uanDquo";perezDquo";Ysomemail(#oo'T;
$#orm*Madd1"eQ"S'number'? B455? ';HG8<89'T;
$#orm*Madd1"eQ"S'#loa"1/'? B455? ';H(G8<?89'T;
$#orm*Madd1"eQ"S'#loa"18'? B455? ';H?G8<(89'T;
$#orm*Madd1submi"ST;
prin" 6empla"eS'A)re)ar 2emo'T*MsoPS$#orm*MsoPSTT;
}
Ge asegur! de tener habilitada la capa de seguridad en el archivo se""in)s(pp)
# Arc<i%o settings"p<p U ;)nea $$
cons" C&,4+I6\15A\&+1&BEIB& = '-n';
I de tener todos los plu(in habilitados)
# Arc<i%o settings"p<p U ;)nea 4#
$enabled1apps = arraUS'securi"UlaUer'? 'Peb#orm'? 'collec"orviePer'T;
Einalmente, modi%iqu! el recurso uardar del controlador, agregando simplemente un prin"1rST del arra0
$17$C6)
# Arc<i%o: appmodules8prue+as8controllers8demo"p<p
public #unc"ion )uardarST {
prin"1rS$17$C6T;
}
n el navegador, ingres! en /pruebas/demo/a)re)ar y al enviar e" +ormu"ario on "a apa de
seguridad ativada, este %ue el resultado de la depuracin del arra0 super(lobal $17$C6)
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
39
ArraU
S
.email0 =M [uanperezYsomemail(#oo
.number0 =M HG8<89
.#loa"1/0 =M HG8<(89
.#loa"180 =M HG8<(89
T
&odos los datos han sido %iltrados de manera inteligente y han llegado al controlador de %orma segura.
5in embargo, desativando "a apa de seguridad)
# Arc<i%o settings"p<p U ;)nea $$
cons" C&,4+I6\15A\&+1&BEIB& = '-!!';
l resultado se ve de la siguiente %orma)
ArraU
S
.email0 =M [uanOperezOYsomemail(#oo
.number0 =M ;HG8<89
.#loa"1/0 =M ;H(G8<?89
.#loa"180 =M ;H?G8<(89
T
sta capa, a(n se encuentra en una %ase e'perimental ya que ?entre otras cosas? resta implementar soporte
para saneamiento de arra0s ,algo que ya estoy probando y ser" incorporado en breve..
MANTENER EL NCLEO ACTUALIZADO
#ecuerda que puedes mantener tu versin de Europio Engine en constante actualizacin, clonando los
archivos del repositorio o+iia") https)==bazaar.launchpad.net=Reugeniabahit=europioe'perimental=trun>=%iles
$ara poder acceder, necesitas tener instalado Ba-aar, el sistema de control de versiones que integra el
proyecto \D3)
ap"*)e" ins"all bzr
$ara clonarlo, simplemente necesitas ejecutar)
bzr branc lp-europioeQperimen"al
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
40
I luego, podr"s mantenerlo actualizado, ejecutando todos los das ,antes de trabajar en el directorio. un)
bzr pull
NOTAS SOBRE EL CDIGO FUENTE
ACTIVACIN
La capa de seguridad ha sido preparada para actuar de %orma autnoma sin necesidad de ser invocada por el
programador.
5u activacin y desactivacin se maneja mediante la constante 8249.:5o/,+o2./27=:72 de%inida en el
archivo se""in)s(pp de la aplicacin.
l inicializador de la capa ,archivo 11ini"11(pp. invocar" al m!todo de limpieza de la capa, solo si el valor
de la constante ha sido establecido en $n( Cua"'uier va"or distinto de -n, provoar$ "a desativai#n
del arranque autom"tico.
i#SucPordsSC&,4+I6\15A\&+1&BEIB&T == '$n'T (((
(((
Cecuri"U5aUerS$s"ric"T*Mclean1pos"1da"aS$sani"ize1arraUT;
So"ui#n a pro%"emas omunesD
5i C&,4+I6\15A\&+1&BEIB& ha sido establecida en 4n y sin embargo la capa parece no estar actuando,
veri%icar que el plu(-in se encuentre habilitado en el archivo se""in)s(pp)
$enabled1apps = arraUS'securi"UlaUer'T;
INTELIGENCIA DE FILTRADO
La capa de seguridad utiliza dos criterios para decidir el tipo de %iltro que debe ser aplicado)
7. por nombre de clave ) solo aplica a los campos de %ormulario cuyo valor sea de tipo e?mail,
considerando como tales, a cualquiera que incluya la cadena mail como parte del nombre. 1e esta
%orma, un campo denominado mail1address ,direccin de correo. sera interpretado como campo de
tipo e?mail. $or lo tanto, se aconseja ser espec%ico con los nombres de los campos y si se desea una
direccin postal ,y los campos se nombran en ingl!s., debera utilizarse pos"al1address.
i#Sstrpos?$$enB 'mail'@ !== 3alseT $"is*Mpur)e1emailS$NeUT;
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
41
<. por contenido ) todo campo que responda 6rue a is/numeric?@ ?previo eliminado %icticio de la coma?
ser" considerado num!rico y evaluado para deducir si se trata de n(mero con coma %lotante o entero.
+er m!todo sanitize/number?@ en lnea @H. &odo campo que no sea de tipo e?mail ni num!rico,
ser" considerado de tipo string aplicando un %iltrado gen!rico. +er m!todo encode/strin?@ en
lnea <H.
Nota adiiona" so%re va"ores num.riosD
La capa de seguridad utiliza inteligencia arti%icial para distinguir el separador de miles del de decimales. 5i el
n(mero posee coma y adem"s punto, supone un n(mero con miles y decimales)
$as1colon = S$pos1colon !== 3alseT;
$as1do" = S$pos1do" !== 3alseT;
i#S$as1colon DD $as1do"T (((
5i la posicin de la coma es mayor a la del punto, entonces la coma indica decimales. 0aso contrario, indica
miles)
$pos1colon = s"rposS$17$C6.$NeU0? '?'T;
$pos1do" = s"rposS$17$C6.$NeU0? '('T;
i#S$pos1colon M $pos1do"T (((
5i posee solo una coma o solo un punto ,pero no ambos., considerar" al signo en cuestin como separador de
decimales)
elsei#S$as1colon Qor $as1do"T (((
&odo caso no contemplado en los condicionales anteriores, ser" considerado un n(mero entero.
Einalmente, aplica el punto como separador de decimales y suprime el separador de miles)
$"is*MelpernumS'('? ''? $NeUT; # reempla>a el punto por un %alor nulo
$"is*MelpernumS'?'? '('? $NeUT; # reempla>a la coma por un punto
FILTRADO EN MODO ESTRICTO
5i la constante 8249.:5o/,+o2./85.:45/d-12 ,de%inida en el se""in)s(pp. es 6rue? aplicar" un %iltro
adicional a todos los campos, aplicando simult"neamente las %unciones "mlen"i"ies y s"rip1"a)s. $or
de%ecto, el valor de strict mode se encuentra establecido en 3alse.
1402220213878
1402220213878
4
1 310258 856007