You are on page 1of 26

THE ORIGINAL HACKER

SOFTWARE LIBRE, HACKING y PROGRAMACIN, EN UN PROYECTO DE

EUGENIA BAHIT

Buenos Aires, 7 de Enero de 2014

@eugeniabahit
GLAMP HACKER Y PROGRAMADORA EXTREMA
HACKER ESPECIALIZADA EN PROGRAMACIN EXTREMA E INGENIERA INVERSA DE CDIGO SOBRE GNU/LINUX, APACHE, MYSQL, PYTHON Y PHP. EUGENIABAHIT.COM DOCENTE E INSTRUCTORA DE TECNOLOGAS GLAMP CURSOS.EUGENIABAHIT.COM CURSOSDEPROGRAMACIONADISTANCIA.COM MIEMBRO DE FOUNDATION FOUNDATION
LA FREE SOFTWARE FSF.ORG, THE LINUX LINUXFOUNDATION.ORG E INTEGRANTE DEL EQUIPO DE DEBIAN HACKERS DEBIANHACKERS.NET.

NDICE DE LA EDICIN NRO3


INGENIERA DE SOFTWARE: DE LAMBDAS, CLOSURES, WRAPPERS Y DECORADORES . DESMITIFICANDO PYTHON P A R T E I ......................................3 INGENIERA INVERSA DE CDIGO EN LA SEGURIDAD
INFORMTICA COMO FORMA DE DETECCIN DE V U L N E R A B I L I D A D E S ..............................9

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

BASH SCRIPTING AVANZADO : UTILIZANDO DECLARE P A R A L A D E F I N I C I N D E T I P O S .................18 E U R O P I O E N G I N E L A B : C O N S U M I R L A API D E EUROPIO ENGINE DESDE EL FRONT-END DE UN SITIO W E B E S T N D A R ................................22

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

The Original Hacker www.originalhacker.org

INGENIERA DE SOFTWARE: DE LAMBDAS, CLOSURES, WRAPPERS Y DECORADORES. DESMITIFICANDO PYTHON PARTE I


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 DE ESTE MES, LAMBDAS Y CLOSURES.

levo aos poniendo caras de sorpresa y asombro cada vez que escucho a mis colegas hablar sobre funciones am!"a, closures, wrappers y "ecora"ores en Python. llevo la misma cantidad de tiempo tratando de dar a mis alumnos un mensaje !tranquilizador! cuando me consultan alarmados por estos !cuatro monstruos!. "o se qu# es lo que rodea a Python que lo hace estar involucrado en e$plicaciones complejas que pretenden hacerlo parecer un lenguaje m%stico, parte de un culto religioso o logia secreta. Pero lo que s% se, es que #$thon no es un engua%e m&stico ni com' e%o. &s tan solo un lenguaje de programaci'n m(s. Potente, s%. )gradable y prolijo, tambi#n. Pero sigue siendo un lenguaje m(s, que por m(s complejidad que se le quiera atribuir, siempre habr( oportunidad de desmiti*icarla y encontrar una e$plicaci'n sencilla. a eso he veni"o con este art&cu o( a "esmitificar un hito en a historia "e este maravi oso engua%e)

FUNCIONES LAMBDA
+uchas veces ,y muy a mi pesar, llamadas !*unciones an'nimas!, las *unciones lambda en Python, no son m(s que una forma "e "efinir una funci*n com-n y corriente, de una -nica instrucci'n de c'digo, en una +nica &nea. &s decir, una *unci'n lambda es la *orma de de*inir una *unci'n que tradicionalmente podr%a escribirse de *orma com-n, en una sola l%nea de c'digo. Pero esto, so o 'o"r, hacerse con a-ue as funciones cu$o a goritmo, no 'osea m,s "e una instrucci*n.

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

The Original Hacker www.originalhacker.org

DEFINIR UNA FUNCIN LAMBDA


La siguiente *unci'n.
def mifuncion(nombre): return "Hola %s!" % nombre

/on lambda, podr%a de*inirse en una sola l%nea de c'digo, ya que posee una -nica instrucci'n. Para ello, se utilizar%a la siguiente instrucci'n.

mifuncion = lambda nombre: "Hola %s!" % nombre

0isto de esta *orma, hasta se corre el riesgo de perderle el respeto a las *unciones lambda. 1e hecho lo anterior, casi no requiere de una e$plicaci'n. 2in embargo, la dar# por si a-n quedan dudas.

Una funcin lambda es una forma de definir una funcin de una sola instruccin, en una sola lnea de cdigo
3na *unci'n lambda es una *orma de de*inir una *unci'n de una sola instrucci'n, en una sola l%nea de c'digo, claro que, con una sinta$is particular.

variable = lambda parametro1, parametro2, parametro9: instruccin a ser retornada

)l igual que las *unciones comunes, as funciones am!"a a"miten 'ar,metros 'or omisi*n y la principal di*erencia es que e resu ta"o "e to"a instrucci*n siem're es retorna"o.

neto = lambda bruto, iva=21: bruto

(bruto ! iva " 1##)

INVOCAR FUNCIONES LAMBDA


.a ama"a a as funciones am!"a es i"/ntica a a "e funciones comunes) &s decir, el hecho de ser *unciones asignadas a una variable, no signi*icar( que #stas se ejecutar(n sin ser invocadas. Por el contrario, son *unciones que al igual que las *unciones comunes, deber(n ser invocadas a trav#s de la variable a la cual se las asignado.

neto = lambda bruto, iva=21: bruto print neto(1##)

(bruto ! iva " 1##)

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

The Original Hacker www.originalhacker.org

# Retorna 121 print neto(2##) # Retorna 242 print neto(bruto=1##, iva=19) # Retorna 119

EL TIPO DE DATOS DE UNA VARIABLE ASIGNADA COMO FUNCIN LAMBDA


3na variable a la cual se le asignado la de*inici'n de una *unci'n lambda, muy intuitivamente, es una varia! e "e ti'o 0funci*n am!"a0 . esta obviedad no es en dem#rito de Python4 muy por el contrario, es o -ue convierte a #$thon en un engua%e con coherencia *gica.

$$$ neto = lambda bruto, iva=21: bruto $$$ neto %function %lambda$ at #&b'a(e#d)$

(bruto ! iva " 1##)

CLOSURES
.os closures son funciones -ue "entro "e e as, "efinen otra funci*n) 5asta aqu%, es una de*inici'n que poco dice sobre los closures, pero si a lo anterior agregamos que al ser invocado un closure, retorna la *unci'n que de*ine dentro, la cosa comienza a verse un poco mejor.

Un closure es entonces, una funcin que define otra funcin y la retorna al ser invocado.
Por ejemplo.

def closure(): def funcion*interna(): return 1 return funcion*interna

)l llamar a closure() lo que en realidad obtendr%amos como resultado, ser%a otra *unci'n, la *unci'n llamada funcion*interna().

variable = closure() print variable()

# Ahora variable es una funcin, la funcin funcion_interna() # Imprimir 1 (1 es el retorno !e funcion_interna()

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

The Original Hacker www.originalhacker.org

0isto de esta *orma, intentamos -nicamente introducir el concepto sint(ctico y *uncional de un closure. )hora nos toca ver c'mo y para qu# se utilizan. 2abemos entonces, que se trata de *unciones que de*inen otra *unci'n dentro y la retornan pero tambi#n, debemos agregar que "ichas funciones internas, tienen a ca'aci"a" "e reconocer $ recor"ar e va or "e varia! es $ 'ar,metros "efini"os "entro "e closure.

def closure(parametro): def funcion(): return parametro return funcion variable = closure(parametro=1) print variable() # Imprime 2 1 # parametro es !e la funcin closure()

hasta aqu%, nuevamente, lo m($imo que hemos hecho es entender c'mo *unciona un closure y c'mo se de*ine e invoca, pero ninguno de los ejemplos ser%a v(lido en t#rminos de buenas pr(cticas, pues ninguno justi*icar%a su implementaci'n.

Un closure DEBE tener una razn de ser. De hecho, mi consejo es evitarlos toda vez que sea posible resolver el planteo sin utilizarlos. Pues dificultan la lectura del cdigo su entendimiento, cuando en realidad, deber!an estar all! para facilitarlo.
3n ejemplo tal vez m(s esclarecedor de un closure bien implementado, podr%a ser el siguiente.

def calcular*iva(alicuota): def estimar*neto(importe*bruto): return importe*bruto (importe*bruto ! alicuota " 1##) return estimar*neto # Productos gravados con el 21% +et*neto*base*21 = calcular*iva(21) ,arina = +et*neto*base*21(1#) arro- = +et*neto*base*21(./(0) a-ucar = +et*neto*base*21(12/0) # Productos gravados con el 10.5% +et*neto*base*1#0 = calcular*iva(1#/0) tv = +et*neto*base*1#0(12(##) automovil = +et*neto*base*1#0((120#)

&l requerimiento anterior, podr%a haber requerido de*inir dos *unciones independientes 6 +et*neto*base*21 y +et*neto*base*1#07 con pr(cticamente el mismo algoritmo y una importante redundancia.

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

The Original Hacker www.originalhacker.org

&n su de*ecto, podr%a haberse resuelto mediante una -nica *unci'n con 8 par(metros, la cual hubiese requerido replicar el valor de uno de los par(metros incansablemente, en las reiteradas llamadas. Pues all%, es donde tenemos la %ustificaci*n 'ara im' ementar un closure1 evitar de*inir m-ltiples *unciones con algoritmos redundantes evitar la sobrecarga de par(metros

"e justificar# el uso de closures cuando su finalidad consista en evitar la redundancia y la sobrecarga de parmetros
Pero para entender mejor el m'vil, veamos en c'digo qu# oportunidades ten%amos.

# Recurrir a al"oritmos re!un!antes def +et*neto*base*21(importe*bruto): return importe*bruto (importe*bruto ! 21 " 1##) def +et*neto*base*1#0(importe*bruto): return importe*bruto (importe*bruto ! 1#/0 " 1##) ,arina = +et*neto*base*21(1#) arro- = +et*neto*base*21(./(0) a-ucar = +et*neto*base*21(12/0) tv = +et*neto*base*1#0(12(##) automovil = +et*neto*base*1#0((120#) # Recurrir a la sobrecar"a !e par metros def +et*neto(alicuota*iva, importe*bruto): return importe*bruto (importe*bruto ! alicuota*iva " 1##) # l#nea re!un!ante

# l#nea re!un!ante

)hora, en las siguientes llamadas, notar el valor recurrente en el primer par(metro las primeras 9 veces y las dos -ltimas.

,arina = +et*neto(21, 1#) arro- = +et*neto(21, ./(0) a-ucar = +et*neto(21, 12/0) tv = +et*neto(10.5, 12(##) automovil = +et*neto(10.5, (120#)

JUSTIFICAR LA IMPLEMENTACIN DE UN CLOSURE


/omo puede verse en los ejemplos anteriores, ninguna de las alternativas !huele bien!. 2i se recurre a la redundancia, por cada tipo de gravamen, deber%amos tener una *unci'n. Por ese motivo, la alternativa queda descartada por completo.

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

The Original Hacker www.originalhacker.org

&n cambio, si se recurre a la sobrecarga de par(metros, se podr%a optar por de*inir un par(metro por omisi'n. 2in embargo :cu(l ser%a el valor de ese par(metro si se tuviesen ;<<< productos gravados con un 8;= y ;<<< con el ;<.>=? 1e*initivamente, se tratar%a de decisiones tomadas de *orma arbitraria y no, basadas en deducciones l'gicas. Es entonces, -ue e 'ar,metro recurrente, motiva e closure $ e a goritmo re"un"ante, a a funci*n interna) Para concluir esta primera entrega, quiero cerrar con uno de esos trucos que generalmente nadie desvela.

La mejor implementacin de un closure no ser# la que ha a sido perfectamente planificada sobre un papel en blanco, sino aquella alcanzada tras un cuidadoso refactoring.
&n la pr'$ima entrega, nos concentraremos en los wrappers y decoradores4 dos *ormas sint(cticamente similares a los closures pero conceptualmente di*erentes.

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

The Original Hacker www.originalhacker.org

INGENIERA INVERSA DE CDIGO EN LA SEGURIDAD


INFORMTICA COMO FORMA DE DETECCIN DE VULNERABILIDADES

LA INGENIERA INVERSA,
NO ES SOLO LO QUE SE CONOCE COMO REVERSING. ES UNA CIENCIA QUE APLICADA AL SERVICIO DE LA SEGURIDAD INFORMTICA, SIRVE PARA DETECTAR VULNERABILIDADES Y RIESGOS DE SEGURIDAD QUE NO PODRAN SER DETECTADOS NI SIQUIERA MEDIANTE HERRAMIENTAS AUTOMATIZADAS DE PENETRACIN (PENTESTING/. QU ES, CMO SE UTILIZA Y PARA QU NOS PUEDE SERVIR LA INGENIERA INVERSA DE CDIGO EN SEGURIDAD?

&

l pasado ;8 y ;9 de diciembre de 8<;9, tuvo lugar en Buenos )ires, el evento de seguridad in*orm(tica A&D Security Conference. &l mismo se llev' a cabo en las instalaciones del @nstituto de Aecnolog%a BCA, cito en la calle C%o de Daneiro ><E de la /iudad )ut'noma de Buenos )ires 6Cep-blica )rgentina7. 1urante la jornada del viernes ;9, estuvo a mi cargo una charla sobre @ngenier%a @nversa de /'digo aplicada en la 2eguridad @n*orm(tica para detectar vulnerabilidades, cuyo resumen transcribo en las siguientes l%neas.

INTRODUCCIN: INGENIERA DE SOFTWARE VS REVERSING


)ntes de comenzar a e$plicar el tema en s% mismo, hice una di*erenciaci'n entre el tema de la charla en s% mismo y lo que se conoce como Reversing. Como Reversing se conoce a una "e as tantas t/cnicas "e a 2ngenier&a 2nversa y muchas veces, se cree err'neamente que dicha t#cnica 6o mejor dicho el t#rmino en s%7, es sin'nimo de @ngenier%a @nversa. 2in embargo, e reversing como t/cnica, consiste en

mani'u ar !inarios enca'su a"os 'ara o!tener e c*"igo fuente)

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

The Original Hacker www.originalhacker.org

10

&sto es, por ejemplo, el uso que se da en la @ngenier%a @nversa de 5ardware, cuando lo que se desea es obtener y se el *irmware ,generalmente de privativo, utilizan herramientas

Luego, coment# que dentro de lo que se denomina @ngenier%a @nversa de 2o*tware, no todo termina en la descompilacin. Aambi#n e$iste la @ngenier%a @nversa sobre el c'digo *uente obtenido 6ya sea el que se logr' descompilar o, sobre c'digo no compilado ya disponible7 y tambi#n 6y muy importante7, se aplica la ingenier%a inversa para F&"&C)C c'digo, es decir, para desarrollar 2o*tware, mediante t#cnicas como A11 (Test-Driven Development).

desensamblado. Lo mismo se da en la @ngenier%a inversa de 2o*tware, cuando lo que se desea, es obtener el c'digo *uente sin compilar 6generalmente, utilizando se e*ect-a sobre de 2o*tware privativo herramientas

descompilacin7.

INGENIERA INVERSA Y PENTESTING CUL Y CUNDO?


&ntre el Pentesting y la @ngenier%a @nversa e$iste una gran di*erencia. mientras el primero busca, de *orma automatizada, *allas que implican riesgos de seguridad conocidos, la @ngenier%a @nversa de /'digo recurre pura y e$clusivamente a al razonamiento l'gico deductivo en busca de hallazgos que permitan no solo corregir el problema sino tambi#n, tomar decisiones. Las herramientas de Pentesting basan su b-squeda en lo conocido, es decir, en la clasi*icaci'n de vulnerabilidades que todos conocemos. Pero :qu# sucede cuando comprobamos que la aplicaci'n ha sido vulnerada y sin embargo no logramos detectar el punto de in*le$i'n mediante test de penetraci'n? &sto se conoce como fa sos negativos y es una de las Ge$cusas per*ectasH para im' ementar 2ngenier&a 2nversa "e c*"igo. 0ulnerabilidades no detectables mediante test de penetraci'n, suelen ser ciertos errores de diseo. Istos son contemplados por la herramientas de pentesting, pero sin embargo, la mayor%a de las veces, un mal diseo 6o mala decisi'n7, no es un error si #ste, es generado de *orma e$ pro*esa. 3n claro ejemplo de malas de decisiones de diseo que no pueden contemplarse como error, son los a backdors, puertas traseras 6o accesos ocultos7 que se *acilitan en un sistema in*orm(tico, que incluso, cuando son programados con las mejores y m(s sanas intensiones, contin-an siendo una "e as vu nera!i i"a"es -ue ma$ores riesgos im' ica.

$a %ngenier!a %nversa de cdigo es el nico mtodo mediante el cual, se puede detectar el 1 ! de las vulnerabilidades de un sistema, incluso aquellas vulnerabilidades no detectables con pentesting

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

The Original Hacker www.originalhacker.org

11

Parad'jicamente, un backdor a pesar de ser uno de los riesgos de seguridad m(s importantes, puede encontrarse resumido en un simple y sencillo algoritmo que no podr%a ser detectado siquiera con la herramienta m(s cruda, robusta y avanzada de pentesting. 3n buen ejemplo, ser%a el siguiente algoritmo en Python, que simplemente comprueba que el hash +1> resultante de la uni'n de el hash +1> del nombre de usuario y el hash +1> de la contrasea, sea la combinaci'n de la llave que abre la puerta trasera.

#$%usr%bin%env p&thon # '(' co!in") utf'* '(' from +etpass import +etpass from ,as,lib import md0 usuario = ra2*input(34sername: 3) clave = md0(+etpass(35ass2ord: 3))/,e&di+est() bac6dor*,as, = "11a9c1b'#.ab1cc100(((01(fa'19).f" bac6door*user = md0( "%(user,as,)s7%(p2d)s" % dict( user,as,=md0(usuario)/,e&di+est(), p2d=clave) )/,e&di+est() 89:;< = =rue if bac6door*user == bac6dor*,as, else >alse

+(s all( de lo descriptivo del nombre de las variables 6elegidas de *orma e$ pro*esa a *in de *acilitar el entendimiento en t#rminos acad#micos7, e backdor "e c*"igo anterior, so o 'o"r&a ser "etecta"o me"iante e an, isis humano. Las malas decisiones de diseo tampoco son errores de diseo 6un error es una acci'n no esperada7 cuando la in$ecci*n "e c*"igo se permite de manera intencional.

$a inyeccin de cdigo por dise"o, ha sido la vulnerabilidad m#s e&plotada por los propios fabricantes de aplicaciones #eb privativas, para atacar instalaciones con licencias no autorizadas
)lgoritmos como el siguiente, son capaces de permitir la inyecci'n de c'digo 5A+L que impida, por el ejemplo, el acceso al panel de control de un /C+.

if(strpos(?*5@A=B3email3C, 3!foobar##(0D12a(#3) === >alse) E ?email = Aafe9ata::validar*email(?*5@A=B3email3C)F Geb>orm::send*mail(?email)F H else E ?das,board*content = ?*5@A=B3email3CF GebAiteIonfi+::save(3das,board3, ?das,board*content)F H

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

The Original Hacker www.originalhacker.org

12

&l c'digo anterior, podr%a encontrarse en la *unci'n de env%o de un simple *ormulario para suscripci'n a bolet%n de novedades. "ada m(s inocuo. 2in embargo, si la cadena !foobar0075-12a70 se insertase en el campo de *ormulario que espera recibir una direcci'n de correo electr'nico, dicho input no ser%a *iltrado, y c'digo como el siguiente, podr%a almacenarse en una base de datos e impedir el acceso a un panel de control.

%div stJle="position: absoluteF top: #F left: #F bac6+round: K###F color: redF fontDsi-e: )emF te&tDali+n: centerF minD,ei+,t: 1##%F" $Iopia de Aoft2are <@ 84=@L;M898%"div$

"uevamente, ninguna herramienta de pentesting, podr%a deducir que ingresando la combinaci'n de los caracteres !foobar##(0D12a( y en ese mismo orden, inutilizado. todo un sistema in*orm(tico podr%a quedar

RESTRICCIONES
La @ngenier%a @nversa de c'digo, tiene un gran enemigo. la ofuscaci*n. 3n c'digo o*uscado puede ser desde un c'digo poco est(ndar e ilegible escrito por un programador poco avezado, hasta instrucciones que de *orma intencional son escritas de manera GrebuscadaH como es el caso del siguiente *ragmento en Dava2cript.

?eastere++=Atrin+/fromI,arIode( ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC, ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC, ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC, ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC, ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC

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

The Original Hacker www.originalhacker.org

13

! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC, ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC, ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC ! BC
Jragmento de c*"igo 3avaScri't ofusca"o que de *orma inocua, pretende ocultar el EasterEgg para /hromium, que program# en el sitio 4e! "e a revista 5ac6ers 7 8eve o'ers 9aga:ine. &l c'digo completo puede obtenerse en http.KKwww.hdmagazine.orgKstaticKjsKeastereggs.js

APLICANDO LA INGENIERA INVERSA DE CDIGO: CMO LEER EL CDIGO FUENTE DE UN SOFTWARE?


+uy *recuentemente, cuando se entrega a un programador el c'digo *uente de un programa, #ste, comienza a e$plorar el directorio abriendo archivos y carpetas de *orma indiscriminada, siendo el orden l'gico elegido, el orden al*ab#tico de los archivos, en el mejor de los casos. 2in embargo, esa no es la *orma correcta 6ni mucho menos 'ptima7 de analizar el c'digo *uente de un programa.

El cdigo fuente de un programa solo puede ser analizado mediante %ngenier!a %nversa.
La @ngenier%a @nversa de /'digo, se aplique con el *in que sea, consiste b(sicamente en encontrar un 'unto "e 'arti"a $ seguir e rastro hasta un 'unto "e -uie!re ;breakpoint<.

1. LOCALIZACIN DE UN ARCHIVO DE INICIO VLIDO


&l punto de partida, siempre, consistir( en la localizaci'n de un archivo de inicio v(lido, v(lido tanto para la aplicaci'n como para los *ines del an(lisis. 2e intenta localizar el archivo principal 6 main7 de la aplicaci'n para posteriormente ubicar la instrucci'n de arranque que nos *acilite el seguimiento de los rastros de c'digo. &sto permitir( conocer c'mo es el mecanismo "e acci*n "e a a' icaci*n *rente a las solicitudes del usuario.

Preferir lo obvio frente a lo dudoso lo simple frente a lo complejo

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

The Original Hacker www.originalhacker.org

14

La imagen izquierda muestra parte de los archivos de la carpeta ra%z de Moodle, un 2o*tware Libre para eLearning desarrollado en P5P, cuyo repositorio o*icial puede localizarse en. https.KKgithub.comKmoodleKmoodle Cesaltado se observa el archivo index.php puesto que, como e$pone la cita de la p(gina anterior, lo obvio es preferible a lo dudoso.

'rente a la duda, ir a lo seguro


&n este otro ejemplo, se elige lo seguro *rente a la duda en general. &l archivo /,taccess es GseguroH.

probablemente all% se describan reglas tanto de reescritura de la 3CL como de archivos de inicio o ra%z. &n este caso en particular, una regla de reescritura nos indica al archivo app*en+ine/p,p como siguiente paso.

C*"igo fuente del archivo .htaccess

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

The Original Hacker www.originalhacker.org

15

Priorizar ejecutables
&n los casos de las aplicaciones 6o herramientas7 desLtop o de l%nea de comandos, siembre deben priorizarse los archivos ejecutables.

2. LOCALIZAR LA INSTRUCCIN DE ARRANQUE


E c*"igo fuente no "e!e eerse "e arri!a hacia a!a%o) 1e hecho, las instrucciones de arranque suelen estar al *inal del archivo. Las -nicas e$cepciones, son los guiones de c'digo 6o archivos de instrucci'n procedural directa7. 2olo los archivos de instrucciones procedurales se leen siguiendo el orden de las instrucciones, un claro ejemplo, es el archivo inde&/p,p de Moodle.

2i se observa el c'digo anterior, las l%neas 8M y 8N ya deber%an hacernos sospechar de la primera vulnerabilidad. &l c'digo est( diciendo. Gsi el archivo con*ig.php no est( en la carpeta ra%z de la aplicaci'n, matar el script

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

The Original Hacker www.originalhacker.org

16

redirigiendo al usuario al archivo install/p,pH. Por deducci'n e incluso antes de leer el archivo install/p,p, deber%amos sospechar. muy probablemente el archivo install/p,p sea el encargado de crear el archivo confi+/p,p. 2i dicho archivo debe crearse en la carpeta ra%z de la aplicaci'n, el directorio ra%z de la aplicaci'n, entonces, deber( tener permisos de escritura m(s all( del propietario 6de hecho, es un requerimiento de Moodle y e*ectivamente, es una vulnerabilidad7. /omo coment# anteriormente, as instrucciones "e arran-ue sue en estar a fina "e os archivos y seguir el rastro, consistir( en localizar dicha instrucci'n y saltar hacia la de*inici'n de la misma. &sto -ltimo, muchas veces puede requerir localizar previamente el archivo que la de*ine, como se muestra a continuaci'n.

Por ese motivo, el orden de lectura del c'digo lo dar(n los rastros de las propias instrucciones y no, el orden en el cual #stas, hayan sido escritas.

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

The Original Hacker www.originalhacker.org

17

PROBLEMAS CONOCIDOS
/uando el problema ya se conoce, se debe intentar reproducir y en *orma paralela deben e$aminarse los logs y depurar el c'digo a *in de identi*icar a los actores 6*unciones, archivos, etc.7, localizarlos y desde all%, ir siguiendo el rastro. /uando alguna de estas acciones no sea posible, se deber(n ejecutar los m#todos habituales descritos en los pasos ; y 8 anteriores.

Las diapositivas de la charla (en formato LibreOffice) pueden descargarse desde www.originalhacker.org/IngenieriaIversaAyD2013.odp

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

The Original Hacker www.originalhacker.org

18

BASH SCRIPTING AVANZADO: UTILIZANDO

DECLARE PARA LA DEFINICIN DE TIPOS

EN

LO QUE A SCRIPTING DE SHELL RESPECTA, GNU BASH ES EL LENGUAJE QUE EL 99,9% DE NOSOTROS ELIGE. SIN EMBARGO, ES EL LENGUAJE QUE MS ABANDONADO TENEMOS. ESCRIBIMOS GUIONES DE SHELL EN GNU BASH SIN IMPORTARNOS SIQUIERA LA LEGIBILIDAD DEL CDIGO Y A PESAR DE ELLO NOS SENTIMOS SATISFECHOS. PERO POR QU AL MENOS NO AVANZAR EN EL CONOCIMIENTO DEL LENGUAJE? Y A ESO, APUNTA ESTA NUEVA SERIE DE ARTCULOS.

&

l comando declare 6tJpeset en ksh7, es un comando incorporado en en el conjunto de herramientas de F"3 Bash, t#cnicamente denominado built in.

)l igual que en lenguajes como /, este builtin nos permite "ec arar varia! es "efinien"o su ti'o "e "atos y haciendo de #ste, un tipo inmutable. Pero las caracter%sticas de declare no concluyen all%. &ntre otras cosas, tambi#n 'ermite a emu aci*n "e constantes como lo es const para / y P5P, por ejemplo. #or "efinici*n, una varia! e es inter'reta"a 'or Bash como string 6una cadena de te$to7, por lo cual, en principio, no podr%amos ver la necesidad de especi*icar dicho tipo, puesto que incluso cuando se le asignara un n-mero como valor, ser%a necesario recurrir a e&pr o a let para tratarlo como tal y e*ectuar, por ejemplo, c(lculos aritm#ticos sobre dicho n-mero. 2in embargo, en el caso contrario, podr%amos ver la necesidad con claridad si lo que se deseara es evitar el uso de e&pr o de let.

DEFINICIN DE CONSTANTES EN BASH


&n bash es posible GdeclararH constantes si se utiliza el comando declare con el argumento Dr o readonlJ con la siguiente sinta$is.

declare -r <@:NLO*I@<A=8<=O="valor fiPo de la constante"

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

The Original Hacker www.originalhacker.org

19

1e esta *orma, si se quisiera modi*icar posteriormente el valor de la constante declarara, el script arrojar%a un error.

#$%bin%bash :8Q*=LR=1 (( :8Q*=LR )) ec,o ?:8Q*=LR # +ali!a) 4 declare -r !"#$%&=' ec,o ?:8Q*=LR # +ali!a) , (( !"#$%&(( )) # -enera un error !e solo lectura) # MAX_TRY: varia le de s!lo lectura

DECLARACIN DE TIPOS: ENTEROS


Podemos adem(s, de*inir una variable como entero, utilizando -i como argumento.

declare -i variable=5 (( variable ec,o ?variable # Imprimir . ))

2i se quisiera modi*icar el tipo mediante reasignaci'n de una string, por ejemplo, !ash eva uar&a a ca"ena "e te=to como 0, tal como se muestra a continuaci'n.

declare Di variable=0 variable=3foo3 ec,o ?variable # Imprimir / variable=bar ec,o ?variable # 0ambi1n imprimir /

Bash eval(a una cadena de te&to )string* como + si la variable ha sido declarada como entero
2i por el contrario, se intentara modi*icar el valor de la variable hacia un tipo *lotante, se producir%a un error ya

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

The Original Hacker www.originalhacker.org

20

que no podr%a ser evaluado como entero.

#$%bin%bash declare Di variable=10## variable=1).* # +ali!a) error sint"ctico: o#erador arit$%tico inv"lido &el ele$ento de error es '.(')

ARITMTICA DIRECTA: PRESCINDIR DE LET Y EXPR


2i una variable ha sido declarada como entero, permitir( la realizaci'n de c(lculos aritm#ticos b(sicos prescindiendo de los comandos let y e$pr.

declare Di anio*nacimiento=19(. declare -i edad=201)-anio#nacimiento ec,o ?edad # Imprimir *+

declare Di espacio*total=10## declare Di usuarios=1# declare -i e+pacio#por#u+uario=e+pacio#total,u+uario+ ec,o ?espacio*por*usuario # Imprimir 150

RESTRICCIN DE MBITO
/uando una variable es de*inida mediante el comando declare, se restringe su (mbito de aplicaci'n. &sto signi*ica que si la variable es declarada dentro de una *unci'n, solo ser( accesible desde dentro de esa *unci'n. Para entenderlo mejor, lo mostrar# con dos ejemplos. utilizando el comando declare y sin utilizarlo.

function set*data() E declare -i e+pacio#total=1000 H function calcular*vps() E set*data declare Di cantidad*vps=espacio*total"2# ec,o Os posible crear ?cantidad*vps S5A sobre este disco H calcular*vps # +ali!a) 2s posible crear 0 34+ sobre este !isco

2in embargo, cuando se trabaja de *orma tradicional sin recurrir al comando declare, la variable se encuentra

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

The Original Hacker www.originalhacker.org

21

disponible *uera del (mbito de la *unci'n que la de*ine.

function set*data() E e+pacio#total=1000 H function calcular*vps() E set*data declare Di cantidad*vps=espacio*total"2# ec,o Os posible crear ?cantidad*vps S5A sobre este disco H calcular*vps # +ali!a) 2s posible crear 50 34+ sobre este !isco

Por favor, notar que si en el ltimo ejemplo NO se hubiese definido la variable cantidad_vps mediante declare, la operacin aritmtica de divisin, no podra haberse llevado a cabo sin la utilizacin de expr

OTROS USOS
&l comando declare tambi#n puede utilizarse para de*inir arra s y *unciones, aunque sin dudas, no nos otorgar( tantos bene*icios como utilizado para los casos e$plicados anteriormente.

declare -a u+uario+=(-0.=/0uan/ -1.=/pepe/ -2.=/ana/ -'.=/eu1enia/) ec,o ?EusuariosBTCH # +ali!a) 5uan pepe ana eu"enia

2i se quisiera obtener una impresi'n literal del array, el comando declare ser%a muy -til.

declare 2 1rep u+uario+ # +ali!a) usuarios6(7/8695uan9 71869pepe9 72869ana9 7,869eu"enia9)

Puede utilizarse tambi#n, para imprimir la lista completa de *unciones declaradas en el script.

function foo() E ec,o 1 H declare -f # imprimir la funcin foo literalmente

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

The Original Hacker www.originalhacker.org

22

EUROPIO ENGINE LAB: CONSUMIR LA API DE EUROPIO ENGINE DESDE EL FRONT-END DE UN SITIO WEB ESTNDAR
EL 80%
DEL SOFTWARE DESARROLLADO CON EUROPIO ENGINE, TIENE POR FINALIDAD LA GESTIN Y ADMINISTRACIN DE GRAN PARTE DE LOS CONTENIDOS PBLICOS DE UN SITIO WEB. INCLUSO, EN ALGUNAS OPORTUNIDADES, LA MISMA INFORMACIN ES REQUERIDA POR MS DE UN SITIO WEB. SIN EMBARGO, UN SITIO WEB NO DEBERA CORRER SOBRE EUROPIO. ENTONCES CUL ES LA ALTERNATIVA Y CMO IMPLEMENTARLA?

omo motor de 2o*tware 6o n-cleo de aplicaci'n7, utilizar &uropio &ngine para crear un sitio Oeb, es un desprop'sito. 2in embargo, en un P<= de los casos, el 2o*tware desarrollado con &uropio &ngine tiene como objetivo, la gesti'n y administraci'n de una parte signi*icativa de los contenidos visibles en un sitio Oeb. +uy *recuentemente me consultan sobre c'mo resolver tal o cual requerimiento a nivel del Oeb 2ite y mi respuesta, siempre es la siguiente.

$n gestor de contenidos es un %oft#are que debe correr de forma independiente al sitios &eb' Desarrollar el sitio ,eb de la forma que tradicionalmente se acostumbra obtener la informacin consultando el -"./ de la 0P% de Europio Engine.
sobre esto, trabajaremos en el laboratorio de esta edici'n4 sobre el consumo de la )P@ desde el !ront-"nd.

PRIMEROS PASOS
)ntes de tomar la decisi'n de comenzar a consumir datos, es necesario preparar el 2o*tware para poder servirlos.

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

The Original Hacker www.originalhacker.org

23

Preparar el 2o*tware es una tarea sumamente sencilla que puede consistir en agregar un simple condicional a los recursos del controlador que manejen los datos p-blicos, o en algo a-n mejor. en crear recursos in"e'en"ientes 'ara ca"a uno "e os "atos -ue "e!an ser servi"os me"iante a A#2 .

ESCENARIO
SE>?28@> A1 ;SoftBare<1 0amos a suponer el caso de un SoftBare que, entre otras cosas, ha sido desarrollado sobre &uropio &ngine, para la gesti'n de una plata*orma de e-#ommerce. 1icho so*tware, corre bajo el dominio http.KKbacLend.e$ample.org sobre la @P *icticia ;89.Q>M.NP.E<. SE>?28@> A2 ;sitio 4e!<1 2e requieren publicar los -ltimos > productos incorporados al cat(logo, en la portada de un sitio 4e!, pero el sitio Oeb corre en un servidor independiente al del 2o*tware con &uropio &ngine, bajo el dominio www.e$ample.org sobre la @P *icticia ;;;.888.999.QQQ.

AVISO: En vez de dos servidores diferentes, podra tratarse de dos Virtual Hosts independientes: uno para el Software con Europio Engine y otro, para el sitio Web.

PREPARACIN DEL CONTROLADOR


)ntes de preparar el controlador, es necesario saber que la )P@ de &uropio &ngine, sirve los recursos vali#ndose de la arquitectura +0/ de la plata*orma. 2i bien la arquitectura de la )P@ es una arquitectura cliente,servidor, la reutilizaci'n de la l'gica +0/ e*ectuada por el servidor de la )P@, es un valioso m#todo para ahorrar recursos y *acilitar la comprensi'n, mantenimiento y esacalabilidad de la aplicaci'n. La )P@ entonces, servir( los recursos vali#ndose de la estructura ,modulo,modelo,recur+o de la 3C@, con la e$cepci'n de que dicha estructura deber( ser antecedida por la palabra api, resultando una 3C@ con la estructura. ,ttp:""dominio"api,modulo,modelo,recur+o 2i recurso *uese un m#todo +0/ e$istente en el controlador, deber%a modi*icarse con un condicional cuando *uese antecedido por la palabra api en la 3C@, tal como se muestra en la documentaci'n o*icial. http.KKeuropio.orgKdocsKapi,rest. 2in embargo, en este laboratorio utilizaremos recursos independientes en el controlador, para proveer datos mediante la )P@. 2obre el escenario anterior, entonces, serviremos los datos sobre los productos mediante la 3C@ "api"ecommerce"producto"+etDultimosDcinco. Lo anterior, supone la e$istencia de un m'dulo llamado ecommerce que cuenta con un modelo denominado producto cuyo controlador deber( de*inir un m#todo 6recurso7 +et*ultimos*cinco(). #ste, es el m#todo que aqu% de*iniremos.

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

The Original Hacker www.originalhacker.org

24

2abemos que la portada del sitio Oeb requerir( solo los -ltimos > productos. Cequerimiento que nada tiene que ver con la orientaci'n a objetos ni mucho menos. 2e trata simplemente de un requerimiento visual. 2in embargo, queremos que nuestra )P@, retorne solo los -ltimos > productos, tal y como los necesitar( el sitio Oeb para su consumo. La alternativa m(s 'ptima en cuanto a consumo de recursos del servidor, ser%a consultar la base de datos, ya que en el supuesto caso de que e$istiesen ;< mil productos, estar%amos leyendo EEE> registros m(s de los necesarios. 2in embargo, dejaremos el tratamiento de datos para un laboratorio *uturo y utilizaremos el colector de objetos para obtener los productos y de all%, eliminar el residuo innecesario. &n el archivo ,appmodule+,ecommerce,controller+,producto.php deber%amos crear entonces, un nuevo recurso, que obtenga la colecci'n de productos invocando al colector.

public function 1et#ultimo+#cinco() E ?obP*collector = IollectorSie2er(35roducto3)F ?coleccion = ?obP*collectorD$collectionF H

&l siguiente paso, consistir( en obtener solo los productos de nuestro inter#s y limpiar todo lo que no sea necesario. 1ado que la colecci'n de objetos se *orma desde el primer objeto almacenado al -ltimo, siendo el primero el menor %ndice del arra de la colecci'n, necesitar%amos e$traer los -ltimos > %ndices del arra de la colecci'n para obtener los -ltimos > productos agregados.

public function +et*ultimos*cinco() E ?obP*collector = IollectorSie2er(35roducto3)F ?coleccion = ?obP*collectorD$collectionF 3thi+-4apidata = arra5#+lice(3coleccion6 -5)7 H

@ncluso, podr%amos crear un recurso mucho m(s *le$ible, donde la cantidad de productos a retornar, sea de*inida en la 3C@ por el cliente.

public function +et*last(3cantidad=5) E +ett5pe(3cantidad6 /int/)7 3off+et = (3cantidad) 8 ab+(3cantidad) 9 -1 : -57 ?obP*collector = IollectorSie2er(35roducto3)F ?coleccion = ?obP*collectorD$collectionF ?t,isD$apidata = arraJ*slice(?coleccion, 3off+et)F H %api%ecommerce%pro!ucto%get,last-10 '' Retornar#a los :ltimos 1/ pro!uctos %api%ecommerce%pro!ucto%get,last-* '' Retornar#a los :ltimos , pro!uctos

Jinalmente, se podr%a destruir lo innecesario con un simple unset del colector. un+et(3ob0#collector)7

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

The Original Hacker www.originalhacker.org

25

CONSUMIENDO LA API DESDE EL SITIO WEB


La *orma simple de consumir la )P@ desde P5P, ser%a mediante la *unci'n file*+et*contents como se muestra a continuaci'n.

?api*uri = 3,ttp:""bac6end/e&ample/or+"api"ecommerce"producto"+et"last"03F ?Pson*data = file*+et*contents(?api*uri)F ?arraJ*data = Pson*decode(?Pson*data)F

/on lo anterior, en ?arraJ*data obtendr%amos un arra similar al obtenido en el recurso de la propia )P@. 2in embargo, una buena pol%tica de los servidores, es tener bloqueada la solicitud e$terna de archivos mediante la directiva allo2*url*fopen del p,p/ini, la cual a*ecta no solo a la *unci'n fopen() sino tambi#n, a file*+et*contents(). 2i bien esto podr%a solucionarse estableciendo dicha directiva en uti ice cC>. como veremos a continuaci'n. =rue 6yo lo he hecho en

http.KKlibrary.originalhacLer.orgK7 no es la mejor opci'n. .a a ternativa correcta es -ue e c iente "e a A#2

UTILIZANDO CURL PARA CONSUMIR LA API


Para utilizar c3CL en P5P, es necesario instalar el paquete php>,curl previamente.

sudo aptD+et install p,p0Dcurl

# ;es!e .e ian (o !istribuciones basa!as en ;ebian)

) continuaci'n, con tan solo > l%neas de c'digo ;, se puede obtener el archivo D2B" en una string al igual que con file*+et*contents.

?api*uri = 3,ttp:""bac6end/e&ample/or+"api"ecommerce"producto"+et"last"03F 3curl = curl#init()7 curl#+etopt(3curl6 :;%<=>$#;%<6 3api#uri)7 curl#+etopt(3curl6 :;%<=>$#%?$;%@$%!@AB?%6 1)7 30+on#data = curl#exec(3curl)7 curl#clo+e(3curl)7 ?arraJ*data = Pson*decode(?Pson*data)F

1e esta *orma, se est( obteniendo un arra de datos que podr( ser manipulado a discreci'n desde la propia inter*az del sitio Oeb, sin tener que recurrir a malas pr(cticas que terminen convirtiendo al 2o*tware en un c-mulo de parches ilegibles.

http.KKwww.php.netKmanualKesKcurl.e$amples.php

3
1401079783709
1401079783709

1 401079

783709

You might also like