Está en la página 1de 22

THE ORIGINAL HACKER

SOFTWARE LIBRE, HACKING y PROGRAMA-


CIN, EN UN PROYECTO DE
EUGENIA BAHIT

@eugen!"!#$
GLAMP HACKER Y
PROGRAMADORA E%TREMA
HACKER ESPECIALI&ADA EN PROGRAMACIN
E%TREMA E INGENIER'A IN(ERSA DE CDIGO
SOBRE GNU)LINU%, APACHE, MYS*L,
PYTHON Y PHP+ EUGENIABAHIT+COM
DOCENTE E INSTRUCTORA DE TECNOLOG'AS
GLAMP CURSOS+EUGENIABAHIT+COM
CURSOSDEPROGRAMACIONADISTANCIA+COM
MIEMBRO DE LA FREE SOFTWARE
FOUNDATION FSF+ORG Y THE LINU%
FOUNDATION LINU%FOUNDATION+ORG+
CREADORA DE PYTHON-PRINTR, EUROPIO
ENGINE, ,ACKTHESTRIPPER+ (IM CONTRI-
BUTOR+ FUNDADORA DE HACKERS N-
DE(ELOPERS MAGA&INE Y RESPONSABLE
EDITORIAL HASTA OCTUBRE -./+
Buen01 A2e1, /3 4e M!y0
4e 53.6
'NDICE DE LA
EDICIN NRO7
BLO*UEOS MUTUOS Y ESTADOS DE CARRERA8 LAS
(ULNERABILIDADES M9S E%PLOTABLES GENERADAS POR
HILOS Y PROCESOS EN LOS SISTEMAS INFORM9TICOS /
INGENIER'A DE SOFTWARE8 PROPIEDADES AL (UELO,
UNA FORMA DE OPTIMI&AR COLECCIONES++++++++++++:
EUROPIO ENGINE LAB8 MANIPULACIN DE DATOS CON
DATAHANDLER+ UN MUNDO M9S ALL9 DE LOS
OB,ETOS+++++++++++++++++++++++++++++++++++++..
DESMITIFICANDO EL CONCEPTO DE SESIONES+ TODO
ES M9S SIMPLE DE LO *UE PARECE+++++++++++++.;
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
3
BLO*UEOS MUTUOS Y
ESTADOS DE CARRERA8 LAS
(ULNERABILIDADES M9S
E%PLOTABLES GENERADAS
POR HILOS Y PROCESOS EN
LOS SISTEMAS
INFORM9TICOS
D'AS ATR9S, INICI< UN
POST SOBRE ESTE TEMA EN
BLOG DE DEBIANHACKERS Y
DADO *UE HAY MUCHO *UE
IN(ESTIGAR SOBRE LA
IMPLEMENTACIN DE HILOS
Y PROCESOS EN LA
INGENIER'A DE SISTEMAS Y
SUS CONSECUENTES RIESGOS
DE SEGURIDAD, DECID'
AGREGARLO EN ESTA
EDICIN, PARA AS' PODER
DAR INICIO A UNA
E%HAUSTI(A IN(ESTIGACIN
AL RESPECTO+
o conozco programador Python que no alucine trabajando
con threa!s" y #ro$ess y a pesar de ello, muy pocos
son los que realmente saben de qu se trata. Pero esto no
es lo peor. Lo peor, es que desconocen los riesgos !e seguri!a!
%ue una ma&a im#&ementa$i'n !e hi&os y #ro$esos #ue!e
generar en to!o un sistema in(orm)ti$o.

!i ya trabajas con threa!s" y #ro$ess este art"culo te aclarar#


algunas dudas con respecto a la seguridad del sistema. Pero si a$n
no haz llegado hasta all", es una *uena (orma !e $omen+ar,
#uesto %ue te &o e,#&i$ar- !e (orma %ue &o entien!as, sin
ro&&os ni te$ni$ismos in.ti&es.
EL PRINCIPIO =*U< ES UN PROCESO>
Primero que nada, %amos a tratar de entender qu es un proceso.
&n proceso, no es m#s que una parte de un programa que se est#
ejecutando. 'cnicamente es un $on/unto !e instru$$iones
ha$ien!o uso !e un $on/unto !e re$ursos !e& sistema.
Cuando hablamos de recursos del sistema nos
referimos a uso de memoria RAM, Swap, CPU, tiempo
de ejecucin, entre otros recursos menos relevantes
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
4
Por este moti%o, cuando se dice que un programa
hace un mal uso de los recursos del sistema, por lo
general es debido a la ejecuci(n desorganizada que
hace de sus propios procesos.
=*U< ES UN HILO>
&n hilo )thread en ingls* es similar a un proceso en
cuanto a que tambin representa un conjunto de
instrucciones. !in embargo, los hilos se di+erencian
enormemente de los procesos, parad(jicamente, por
la administraci(n que hacen de los recursos del
sistema. , esta $ltima, es la caracter"stica que
di+erencia a los hilos de los procesos, tal como te lo
e-plico en el siguiente p#rra+o.
THREADS (S+ PROCESOS8 =CU9L ES LA DIFERENCIA ENTRE HILOS Y PROCESOS>
La di+erencia +undamental, es que ambos
administran los recursos de +ormas di+erentes.
0ientras %ue &os !i(erentes #ro$esos !e un
mismo #rograma o$u#an !i(erentes es#a$ios
en &a memoria, !i(erentes hi&os $om#arten un
mismo es#a$io.
. primera %ista, esto nos puede hacer suponer que
los threads son una mejor alternati%a que los
procesos, puesto que utilizar#n menor espacio de
memoria. /sto es muy cierto, pero no son la
panacea. Pueden acarrear m$ltiples problemas de
seguridad tal como e-plicar m#s adelante. o
obstante, el uso de procesos en %ez de threads,
tambin solucionar# problemas 0a ni%el seguridad de
la aplicaci(n0 que estos $ltimos no tienen capacidad
de resol%er. Pero %ayamos de a poco.
PROBLEMAS DE SEGURIDAD GENERADOS POR LOS THREADS
'odo conjunto de hilos o de procesos, probablemente
necesite compartir in+ormaci(n entre ellos. !in lugar
a dudas, ser# mucho m#s +#cil compartir in+ormaci(n
si se comparte un mismo espacio de memoria, que
hacerlo si hay que estar saltando de un puntero
hacia otro. Por consiguiente, $om#artir
in(orma$i'n ser) mu$ho m)s ()$i& #ara &os
threa!s %ue #ara &os #ro$esos.
!in embargo, compartiendo grandes cantidades de
in+ormaci(n y haciendo un uso signi+icati%o de tareas
concurrentes a tra%s de threads, se #ue!en
#ro!u$ir !os vu&nera*i&i!a!es tr)gi$as1 &na de
ellas, la llamada *&o%ueo mutuo" )deadblock en
ingls*2 la otra y a la %ez m#s peligrosa, la
denominada $on!i$i'n !e $arrera" )race
condition en ingls*.
Bloqueo mutuo (deadlock): Es el bloqueo irreversible
de un conjunto de hilos o procesos
&n bloqueo mutuo es lo que sucede cuando un
programa se te queda 3colgado4 y te %es en la
obligaci(n de 3matar un proceso4 ya que el conjunto
de hilos o procesos bloqueados, no tiene soluci(n.
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
5
Condicin (o estado) de carrera: Es a!uel !ue se
produce cuando varios hilos o procesos intentan
modificar de forma simultnea a un mismo recurso
!i m#s de un hilo o recurso intenta modi+icar el
estado o %alor de un mismo recurso al mismo
tiempo, los datos dejan de ser con+iables y por
consiguiente, es correcto a+irmar que &os !atos
%ue!an $orru#tos.
Por ejemplo, si 5uan y .na intentan modi+icar la
contrase6a del usuario admin al mismo tiempo. 5uan
decide colocar 789:;< y .na, 8899:: =cu#l de las
dos cla%es ser# +inalmente, la cla%e del usuario
admin> La respuesta es que si el programador no
contempl( est# posibilidad, ser# impre%isible conocer
la cla%e. ?ncluso, podr"a quedar corrupta a tal punto
de quedar sin cla%e. /sta concurrencia mal
implementada es la que se denomina condici(n de
carrera, donde los actores 3compiten4 por %er quien
3gana4 la modi+icaci(n del dato.
Los estados de carrera en un sistema in+orm#tico
son ()$i&mente e,#&ota*&es me!iante
exploits &o$a&es. Por ese moti%o, representan uno
de los riesgos de seguridad m#s gra%es en un
sistema.
LINU% Y GNU (S SISTEMAS OPERATI(OS PRI(ATI(OS
/n m#s de una oportunidad habr#s escuchado decir
que Linu- )el @ernel* y los sistemas operati%os A&
que lo implementan, hacen una mejor administraci(n
de recursos que los sistemas operati%os pri%ati%os
com$nmente usados por el usuario promedio y que
no se encuentran basados en &ni-. /sto simplemente
hace re+erencia al costo que la creaci(n y
destrucci(n de procesos, implica en los distintos
sistemas.
1anto en 2inu, y 3ni, a nive& 4erne& $omo en
5N3 a nive& sistema o#erativo, e& $osto !e
$rea$i'n y !estru$$i'n tanto !e hi&os $omo !e
#ro$esos #ue!e ser $asi im#er$e#ti*&e,
mientras %ue en sistemas o#erativos #rivativos
con n$cleos di+erentes, e& $osto es muy e&eva!o y
por ese moti%o, en estos sistemas, se utilizan m#s los
threads que los procesos. Be all" que com$nmente se
escuche decir que estos sistemas son m#s
%ulnerables que los que implementan Linu- o &ni-.
USO DE PROCESOS *UE E(ITAN ERRORES DE DISE?O E%PLOTABLES
&n buen uso de procesos y de pre+erencia de estos
+rente a los hilos, se da cuando una aplicaci(n
requiere e+ectuar tareas simult#neas con usuarios
di+erentes. Puede que no te hayas planteado emplear
di+erentes usuarios para di+erentes tareas de tu
aplicaci(n y esta es una e-celente oportunidad.
A#a$he nos da un ejemplo concreto de ello.
.pache utiliza m$ltiples procesos con di+erentes
usuarios para la ejecuci(n de sus tareas. /l enlace a
los puerto de bajo n$mero 0como el puerto CD, por
ejemplo0 lo realiza a tra%s el usuario root mientras
que el procesamiento de las solicitudes Eeb, lo
e+ect$a con el usuario www0data quien tiene
permisos muy in+eriores a los de root.
Fasos como el de .pache, son los que e%itan que
+rente a un error producido en el c(digo de las tareas
ejecutadas por usuarios con permisos escuetos,
ejecuten acciones solo permitidas al usuario root. La
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
6
$nica +orma de que esto suceda, ser"a escalando
pri%ilegios para lo cual, otro error ser"a necesario de
+orma simult#nea pero en el c(digo de las tareas
asignadas al usuario root.
TRABA,O DISTRIBUIDO Y PORTABILIDAD
Gtra de las grandes %entajas que los procesos
+acilitan +rente a los hilos, es la de permitir una
mayor portabilidad en las aplicaciones y posibilidad
de compartir el trabajo de +orma simple
)caracter"stica por e-celencia en las arquitecturas
cliente0ser%idor*.
/sto signi+ica que si lo que se necesita es una
aplicaci(n que permita distribuirHcompartir el trabajo
a tra%s de una red local o e-terna, la ejecuci(n de
tareas mediante di+erentes procesos, ser# la $nica
alternati%a. Faso contrario, la aplicaci(n podr"a
responder de +orma impredecible +acilitando as" la
corrupci(n de los datos y su consecuente
e-plotaci(n.
NOTA FINAL SOBRE THREADS8 HILOS DEL KERNEL (S HILOS DE
USUARIO
/s muy importante que como programador o
programadora, entiendas que !i(erentes hi&os
$om#arten un mismo P67 )process identifier o
identi+icaci(n de proceso* mientras que di+erentes
procesos, poseen sus propios P?B. Be all" que
+recuentemente puedas escuchar +rases como los
diferentes hilos de un proceso.
!in embargo, esto no es as8 a nive& !e& 4erne&.
Los hilos del @ernel tienen sus propios P?B. /sto es
debido a la +orma en la que el Iernel es ejecutado.
/l @ernel en s" mismo no se ejecuta como un proceso
sino que sus tareas corren como parte de otros
procesos. .l ser una cantidad de tareas signi+icati%as,
e& 4erne& se ve o*&iga!o a im#&ementar
a$$iones a&ternativas %ue o#eren !e (orma
simi&ar a &os #ro$esos, a +in de abaratar costos.
/stas acciones alternati%as son &os (amosos
!emonios )daemon en ingls* los cuales se ejecutan
constantemente en segundo plano, asegurando de
esta +orma, un menor uso de los recursos ya que en
caso contrario, de no estar disponibles de +orma
constante al usuario, ste deber"a in%ocar a dichos
ser%icios cada %ez que necesitara hacer uso de ellos.
/sto implicar"a nue%os procesos cre#ndose y
destruyndose de +orma permanente.
Fuando hablamos de caro o barato re+irindonos al
uso de recursos del sistema, estamos diciendo que
9a mayor uso !e :A0 y mayor tiem#o !e
e/e$u$i'n, m)s $ara es &a im#&ementa$i'n;.
/n entregas +uturas, procurar a%anzar en cuestiones
m#s espec"+icas sobre la implementaci(n de hilos y
procesos en la ?ngenier"a de aplicaciones. Pero
mientras tanto, si #rogramas en Python, !es!e
ahora en m)s, antes !e !e$i!ir uti&i+ar threads,
#iensa en &o %ue a$a*as !e &eer<
=0e ayu!as $on 1he >rigina& ?a$4er@
!i 'he Griginal Jac@er te resulta de utilidad, me ayudar"as mantener el proyecto $on un sim#&e !onativo1
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
7
INGENIER'A DE SOFTWARE8
PROPIEDADES AL (UELO,
UNA FORMA DE OPTIMI&AR
COLECCIONES
LOS OB,ETOS TIENEN LA
FACILIDAD DE PODER CREAR
PROPIEDADES UNA (E&
INSTANCIADOS+ POR LO
GENERAL, ESTA
CARACTER'STICA SE UTILI&A
COMO UNA MALA PR9CTICA+
SIN EMBARGO, PUEDE
EMPLEARSE COMO T<CNICA
DE OPTIMI&ACIN DE FORMA
TAL *UE PERMITA UNA
INDEPENDENCIA MODULAR
ABSOLUTA+
uando se trabaja con objetos en estado puro, una colecci(n
puede terminar consumiendo un sin+"n de recursos que
para lo que se necesita controlar, suelen ser innecesarios. F
Lamentablemente, en la mayor"a de los casos los programadores
terminamos optando por crear mtodos que terminan manipulando
datos dejando a un lado todos los principios de la programaci(n
orientada a objetos y junto a ellos, la gran cantidad de bene+icios
que dichos principios nos +acilitan.
/stos casos que como bien dije antes nos lle%an a lamentar la
decisi(n, necesitan 0sin lugar a dudas0 de una soluci(n no solo
%iable y que resuel%a realmente el problema, sino que adem#s, no
se aparte de los principios de la programaci(n orientada a objetos
m#s pura.
EL PROBLEMA8 PROPIEDADES COLECTORAS
Por lo general, el mayor problema con las $o&e$$iones de objetos, se da en aquellas cuyos compositores se
encuentra a la %ez, compuestos de colecciones. /s decir, en aquellos casos donde &os $om#ositores #oseen
#ro#ie!a!es $o&e$toras. !in lugar a dudas es lo peor que nos puede pasar al necesitar manipular
colecciones de objetos en estado puro, sobre todo si lo que se pretende es e+ectuar un manejo b#sico.
/n al menos el KCL de las aplicaciones orientadas a objetos, todo, absolutamente todo el dise6o de objetos
genera en este sentido, un cuello de botella a partir del objeto &suario, del cual, m#s temprano que tarde,
todos los objetos terminar#n dependiendo, ya sea por cuestiones de herencia o por composici(n directa.
, esto comienza a ser un problema %isible, a medida que %amos agregando nue%os m(dulos al sistema. /s
simple %er como cada uno de los m(dulos genera su propia +igura de usuario pero sin embargo, en muchas
ocasiones )en la mayor"a me arriesgo a decir*, no e-iste una %erdadera di+erencia entre los usuarios de un
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
8
m(dulo y los de otros, e-cepto por el tipo de objetos que lo componen. Por ejemplo, si en el mismo sistema
con%i%iesen un m(dulo de telemedicina y otro para compartir c(digo +uente )con lo son las aplicaciones
pastebin, por ejemplo*, en el primer caso los usuarios ser"an mdicos mientras que en el segundo,
programadores. .mbos tendr"an un nombre de usuario y un ni%el de acceso. Pero mientras que un mdico
podr# tener una colecci(n de casos )o de registros mdicos electr(nicos*, el programador, tendr# una
colecci(n de c(digos +uente. =Para qu crear entonces dos tipos de usuarios di+erentes> =Por qu mejor no
reutilizar el mismo usuario y di+erenciarlos solo por su rol dentro del sistema>
LA SOLUCIN
Bespus de mucho in%estigar, probar, hacer y rehacer, la idea de reutilizar al mismo objeto usuario en cada
m(dulo, sin heredar de l y de hecho, sin siquiera crear nue%as +iguras, ha demostrado solucionar no solo el
problema aqu" planteado, sino adem#s, arroj( grandes bene+icios, entre ellos, los principales son1
&ni+ica conceptos y sentando un est#ndar de +orma indirecta1 todos los m(dulos utilizar#n al mismo
tipo de objeto como $nico tipo de usuario2
Macilita la independencia y portabilidad de los m(dulos1 al no ser necesaria la modi+icaci(n del objeto
usuario en el mismo objeto usuario, un mismo m(dulo podr# ser portado a cualquier aplicaci(n que
cuente con un objeto de tipo usuario que al menos posea una propiedad ?B2
Jace m#s r#pido el entendimiento del c(digo ya que el programador solo se centrar# en los objetos
troncales.
Las propiedades colectoras se crear"an al %uelo y en tiempo de ejecuci(n, en cada uno de los m(dulos.
Be esta +orma, el objeto usuario permanecer"a intacto y con un conjunto de propiedades est#ndar1
class Usuario {
public function __construct() {
$this->usuario_id = 0;
$this->denominacion = '';
$this->nivel = 0;

, los m(dulos de telemedicina y pastebin se encargar"an de agregar sus colecciones respecti%as1


# Recurso del controlador del modelo CasoClinico del mdulo de telemedicina
# Lista los casos clnicos del usuario que solicita el recurso
# Antes de invocar al mtodo get() del usuario, crea la propiedad colectora que almacenar
# dichos casos clnicos
public function listar() {
$usuario = ne! Usuario();
$usuario->usuario_id = isset($_"#""$%&''user_id'() ) $_"#""$%&''user_id'( * 0;
$usuario->casoclinico_collection = array();
$usuario->+et();

The Original Hacker www.originalhacker.org


2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
9
# Lo mismo har el recurso del controlador del modelo Codigouente del mdulo paste!in
public function listar() {
$usuario = ne! Usuario();
$usuario->usuario_id = isset($_"#""$%&''user_id'() ) $_"#""$%&''user_id'( * 0;
$usuario->codigofuente_collection = array();
$usuario->+et();

Fomo puede %erse, es un simple artilugio que respetando los principios de la PGG es capaz de optimizar el
rendimiento de la aplicaci(n de +orma impensada.
UTILI&ANDO @@CALL PARA CREAR PSEUDO M<TODOS DE
AGREGACIN AL (UELO
Minalmente, habr# que tener en cuenta que por cada propiedad colectora, un mtodo de agregaci(n ser#
necesario e in%ocado por +et() cada %ez que ste sea llamado. !i en el modelo de usuario tu%isemos que
crear tantos mtodos de agregaci(n como propiedades colectoras +uesen a crearse al %uelo, se perder"a toda
portabilidad y no solo %ol%er"amos al principio, estar"amos haciendo un modelo in%iable.
/l mtodo m#gico __call() de PJP
7
ha sido dise6ado para actuar cuando el mtodo inaccesible de un objeto
es in%ocado )notar que no sir%e para cuando el mtodo es in%ocado como +unci(n de clase. /n ese caso, debe
emplearse __call"tatic()
,
*. Be+iniendo este mtodo en la clase usuario, su clase madre o en la que sea
necesario crear propiedades colectoras al %uelo, estar"amos dando soluci(n al problema.
&na implementaci(n b#sica de este mtodo, podr"a %erse como la siguiente1
function __call($call- $ar+) {
if(strpos($call- 'add_') === 0 .. $ar+) {
$cls = str_replace('add_'- ''- $call);
$propert/ = 0{$cls_collection0;
if(1propert/_e2ists($this- $propert/)) $this->$propert/ = arra/();
$this->$propert/ = arra/_mer+e($this->$propert/- $ar+);


E/em#&o $o#ia!o &itera&mente !e& m-to!o __call() !e& o*/eto StandardObject
3
!e Euro#io Engine
/l mtodo __call() recibe dos par#metros desde el intrprete1 el primero, es el nombre del mtodo que se
intenta in%ocar. /l segundo, un array con cada uno de los argumentos pasados al mtodo inaccesible durante
su llamada.
7 http1HHwww.php.netHmanualHesHlanguage.oop;.o%erloading.phpNobject.call
8 http1HHwww.php.netHmanualHesHlanguage.oop;.o%erloading.phpNobject.callstatic
9 https1HHbazaar.launchpad.netHOeugeniabahitHeuropioe-perimentalHtrun@H%iewHhead1HcoreHormPengineHobjectsHstandardobject.
phpNL<D
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
10
/l condicional del mtodo se encarga de %eri+icar que el nombre del mtodo inaccesible comience por la
cadena add_ )esto le dar# la pauta de que se trata de un mtodo de agregaci(n* y que el array $ar+ no est
%ac"o.
if(strpos($call- 'add_') === 0 .. $ar+)
Para de+inir el nombre de la propiedad colectora, simplemente eliminar# add_ del nombre del mtodo y
concatenar# el resultado a _collection1
$cls = str_replace('add_'- ''- $call);
$propert/ = 0{$cls_collection0;
Minalmente, si la propiedad no e-iste )por si se ol%id( crearla*, la crear# para luego, combinarla con la actual1
if(1propert/_e2ists($this- $propert/)) $this->$propert/ = arra/();
$this->$propert/ = arra/_mer+e($this->$propert/- $ar+);
Gbtn tu tarjeta de dbito QasterFard AR.'?!S
T una cuenta bancaria en &!. para trans+erir tu dinero desde PayPal desde http1HHbit.lyHpromo0payoneer
)S* Para obtener la tarjeta sin costo !e*es ha$er una $arga ini$ia& !e 3S7 100 y registrarte $on e&
en&a$e de esta promoci(n. 7e &o $ontrario, se !e*itar)n 3S7 2A de tu primera carga. La cuenta bancaria
%irtual te permite trans+erir el dinero desde PayPal y que se acredite autom#ticamente en tu QasterFard.
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
11
EUROPIO ENGINE LAB8
MANIPULACIN DE DATOS
CON DATAHANDLER+ UN
MUNDO M9S ALL9 DE LOS
OB,ETOS+++
ESTE ART'CULO NO SOLO
PRETENDE DOCUMENTAR AL
OB,ETO DATAHANDLER DE
EUROPIO ENGINE, SINO *UE
ADEM9S, SER(IR9 COMO
FUENTE DE REFERENCIA
PARA EL PSEUDO MAPEO DE
TABLAS MEDIANTE
INFORMATION@SCHEMA+
esde hace %arios meses atr#s, el tema m#s redundante en
los cursos de capacitaci(n que imparto sobre /uropio
/ngine, era la manipulaci(n de datos en el #mbito de los
objetos. Pero no se trataba de algo caprichoso, sino de una
necesidad real1 =qu sucede cuando necesitamos e+ectuar
estad"sticas sobre datos, e%itando adrede el uso de objetos>
B
.ntes de preocuparnos por el Uc(mo siempre debemos
plantearnos Uqu necesitamos y a partir de all", decidir qu es lo
que tenemos que hacer, pero no antes. , de esos Uqu +ue que
termin( surgiendo la necesidad de crear un objeto que permitiese
trabajar con datos sin tocar la estructura de las tablas empleadas
por los objetos.
Por este moti%o, aun%ue a.n no hayas uti&i+a!o Euro#io
Engine como core de tus aplicaciones, te re$omien!o &eer este
art8$u&o ya que te ser%ir# para %er c(mo resol%er el tratamiento de
datos en tus aplicaciones orientadas a objetos.
MANIPULACIN DE DATOS (S+ TRABA,O CON OB,ETOS
Para que e-ista una ne$esi!a! rea& !e mani#u&a$i'n !e !atos )y no de objetos* deben cumplirse ciertas
caracter"sticas1
7. 7e*e estar !ire$tamente re&a$iona!a a &a *ase !e !atos< Por ejemplo, decir Unecesito localizar
los objetos X que pertenezcan al usuario Y no es una necesidad real ya que estamos hablando de
objetos y cometiendo el error de tratar de manipular objetos como si +uesen datos. !iguiendo el
ejemplo, obtener la colecci(n de objetos V del usuario , deber"a ser lo que suceda por de+ecto. /s
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
12
decir, se soluciona con un buen dise6o de los objetos )el usuario Y tendr# una propiedad colectora
objeto_x y recuperando al usuario , se recuperar# la colecci(n de los objetos X que lo componen. Para
saber c(mo lograr un dise6o de objetos de este estilo, re+erirse al art"culo anterior sobre propiedades
al vuelo*2
8. 7e*e tener una *ase s'&i!a so*re &a $ua& /usti(i$ar &a ne$esi!a! !e tra*a/ar $on &os !atos<
Por ejemplo, la necesidad de crear una herramienta de an#lisis de rendimiento de la base de datos
ser"a una justi+icaci(n aceptable. Qientras que cualquier requerimiento %isual sobre los objetos, no
ser"a justi+icaci(n su+iciente para manipular datos directamente desde la propia base de datos2
9. No !e*e e,istir una (orma '#tima y via*&e !e reso&ver e& re%uerimiento mani#u&an!o
o*/etos< /ste "tem debe ir de la mano con el anterior. Por ejemplo, si lo que se desea es obtener
estad"sticas sobre uso del sistema, un requerimiento podr"a resol%erse de +orma %iable Uobteniendo
registros de una sola tabla que obteniendo una colecci(n de objetos y haciendo el an#lisis estad"stico
sobre toda la colecci(n, ya que obtener una colecci(n de 7DDD objetos podr"a implicar e+ectuar
consultas a decenas de tablas, algo que no justi+icar"a para conocer cu#ntos datos se cargaron en la
BB en los $ltimos ;W, por ejemplo.
:. 7e*e tratarse !e ne$esi!a!es !e so&o &e$tura< 5am#s debe escribirse sobre la base de datos
destinada al almacenamiento de in+ormaci(n sobre los objetos. !olo los modelos pueden escribir en su
propia tabla y esto debe respetarse de +orma estricta. Be lo contrario, se pierde toda garant"a sobre
rendimiento y +uncionamiento de la aplicaci(n.
Jabiendo aclarado estos puntos +undamentales, paso directo a hablar sobre BataJandler.
DATA8 UN NUE(O MDULO INCORPORADO AL CORE DE EUROPIO
ENGINE
Primero me en+ocar en c(mo se utiliza este m(dulo )es %erdaderamente muy simple* para luego e-plicar
c(mo trabaja de +orma interna.
EL OB,ETO DATAHANDLER
Fomo su nombre lo indica, se trata de un manejador de datos y es por el momento, el $nico objeto disponible
del m(dulo.
.l ser instanciado, este objeto necesitar# dos par#metros1 el nombre de la tabla sobre la que se trabajar#
)obligatorio* y el +ormato en el que se desea obtener los resultados )opcional, por de+ecto retorna un array de
datos*.
3ata4andler(string $tabla'- const $formato=34_5%6789_3898()
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
13
/l +ormato )opcional* debe ser una de las constantes prede+inidas por /uropio /ngine. /stas pueden ser1
DH_O!"#$_D#$# 5ormato al :ue se refiere* array de datos%
Un arra/ cu/os elementos ser;n arra/s asociativos (nombre de clave
ser; nombre de campo)< Utili=ado como valor por defecto<
DH_O!"#$_O&'()$ 5ormato al :ue se refiere* array de objetos%
Un arra/ cu/os elementos ser;n ob>etos<
&otar :ue 34_5%6789_%?@#A9 no retorna los datos de una tabla
convertidos a ob>etos sino :ue en base a los datos obtenidos se
encar+ar; de crear los ob>etos correspondientes<
M<TODOS
Por el momento, solo dispone de 8 mtodos p$blicos.
get_latest(int $n)
Retorna los "ltimos # registros$
# %&%'(L) *% +,)
$ultimos = 3ata4andler('comentarios')->get_latest(*+);
# devolver los "ltimos -. registros de la ta!la llamada comentarios
filter(string $condition,- const $filter=DH_./$(!_(01)
Retorna los registros coincidentes con la condicin pasada como primer parmetro$
/l ti#o !e (i&tro $filter podr# ser cualquiera de las constantes prede+inidas por /uropio /ngine1
-------------------B-------------------B------------
)O2S$#2$( S.32..)#DO S.32O
-------------------B-------------------B------------
34_5$C9#6_#DE i+ual :ue =
34_5$C9#6_&%9#D distinto :ue F>
34_5$C9#6_C9 menor :ue F
34_5$C9#6_G9 ma/or :ue >
E valor por defecto
Por el momento, filter() admite una $nica condici(n cuyo operador sea cualquiera de los anterios.
$productos = 3ata4andler('productos')->filter(45roducto_id 6 74- DH_./$(!_/$);
Retornar los primeros registros donde la /* sea menor que 0
DATAHELPER, EL BACKSTAGE DEL OB,ETO DATAHANDLER
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
14
BataJelper se encarga de Umeter mano en la base de datos. !u objeti%o es el de sustituir la +unci(n de un
GRQ ya que si trabajamos realmente con datos no ser"a correcto mapear objetos. , para lograrlo, debe e%itar
meterse en la tabla de los objetos de +orma directa.
/ntonces =c(mo crear queries din#micos sin mapear los objetos> /s muy simple1 se pseudo0mapea la tabla
=c(mo> Fonsultando a la tabla )O/8"2S de .2O!"#$.O2_S)H("# de 0ySB21
"#C#A9 A%CU7&_&87#-
$5(A%CU7&_9HI# C$J# 'KintK'- 'i'-
$5(A%CU7&_9HI# C$J# 'KdecimalK'- 'd'- 's')
)
!O" .2O!"#$.O2_S)H("#%)O/8"2S
L4#6# 98?C#_"A4#78 = )
8&3 98?C#_&87# = )
98?C#_"A4#78 ser# el nombre de la base de datos de la aplicaci(n, mientras que 98?C#_&87# el que se
haya pasado como par#metro al crear el 3ata4andler. Para %er un ejemplo completo, recomiendo estudiar
el c(digo +uente de BataJelper
:
.
Contratan!o un CPS $on e& en&a$e !e esta #u*&i$i!a!, me ayu!as a mantener 1he >rigina& ?a$4er DE
Servi!ores a solo 3S7 F G mes1
20 5B de disco
Biscos SS7
7 'B de trans+erencia
F12 QB :A0
6nsta&a$i'n en menos !e 1H
/lige 3*untu Server 12<04 21S y despreoc$pate de
la seguridad, optimiz#ndolo con Ia$41heStri##er
Luego de instalarlo, $on(ig.ra&o $on Ia$41heStri##er1 http1HHwww.eugeniabahit.comHproyectosHjac@thestripper
Contratan!o $on este en&a$e, me ayu!as a mantener e& servi!or !e 1he >rigina& ?a$4erD http1HHbit.lyHpromo0digitalocean
: https1HHbazaar.launchpad.netHOeugeniabahitHeuropioe-perimentalHtrun@H%iewHhead1HcoreHdataHdatahelper.php
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
15
DESMITIFICANDO EL
CONCEPTO DE SESIONES+
TODO ES M9S SIMPLE DE
LO *UE PARECE+++
UNA DE LAS CONSULTAS *UE
MIS ALUMNOS ME HACEN EN
LOS CURSOS DE M(C ES
*U< HACER ACON LOS
LOGINA EN UNA
APLICACIN+ REALMENTE ES
ALGO MUY SENCILLO, SI SE
SABE CON E%ACTITUD DE
*U< SE TRATA ESTO DEL
MANE,O DE SESIONES
l concepto de Usesiones, b#sicamente es una entelequia.
o e-iste un concepto de Usesi(n como tal y que sea
independiente al concepto de cookies. /
Las sesiones, son en rea&i!a! un mo!o !e #ersisten$ia !e
!atos mediante la intera$$i'n !e ar$hivos en e& #ro#io
servi!or y en el ordenador del usuario )o sea, cookies*.
/l concepto de sesi(n, se re(iere a &a me$)ni$a uti&i+a!a #ara
generar &a #ersisten$ia tem#ora& !e $iertos !atos !e&
usuario.
Bicha mec#nica, consiste b#sicamente en1
6!enti(i$a$i'n !e& usuarioD se identi+ica a
cualquier usuario que ingresa a un sitio Eeb,
mediante un identi+icador $nico )?B, que por cierto,
nada tiene que %er con las bases de datos*. Por
ejemplo1 imaginemos que estamos desarrollando un
nue%o lenguaje de programaci(n. /ntonces, cada %ez
que una persona ingresa en el sitio Eeb, de +orma
autom#tica, nuestro script le Uin%enta un Uc(digo o
cadena de identi+icaci(n, $nico para ese usuario.
Persisten$ia !e& i!enti(i$a!orD el proceso de
persistencia del identi+icador, es un proceso interno
que debe realizarse en el ser%idor. Fonsiste en
implementar una mec#nica que permita almacenar
de +orma temporal, el identi+icador asignado al
usuario, hasta que ste abandone el sitio. La mayor"a
de los manejadores de sesiones o de los lenguajes
como PJP que implementan dicho concepto de +orma
nati%a en el propio lenguaje, di%iden esta mec#nica
en dos acciones1
7* .lmacenamiento del identi+icador en el
ser%idor, el cual puede imaginarse como un
archi%o temporal2
8* .lmacenamiento del identi+icador en el
ordenador del usuario, el cual no es m#s que
una cookie.
/l uso de cookies en el ordenador del usuario, podr"a
e%itarse si por ejemplo, en el archi%o del usuario en
el ser%idor, se guardara in+ormaci(n di%ersa sobre el
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
16
usuario1 desde su ?P hasta la %ersi(n del sistema
operati%o. !in embargo, esto podr"a traer aparejadas
consecuencias indeseables1 desde una sobrecarga
del ser%idor, hasta la colisi(n de usuarios que
mediante un proxy, pudieran utilizar la misma ?P. /s
por este moti%o, que la mejor soluci(n encontrada
hasta ahora, ha sido el uso m$ltiple de archi%os1 en
el ser%idor y en el cliente, a modo de ookies.
/sta, es la base del manejo de sesiones y nada tiene
que %er con un concepto tangible ni mucho menos,
con los procesos de registro de usuarios e
identi+icaci(n mediante el ingreso de cla%es pri%adas.
Por este moti%o, hay que aprender a diferenciar
entre el manejo de sesiones y la gestin de
usuarios.
GESTIN DE USUARIOS (S+ MANE,O DE SESIONES
La gesti(n de usuarios, debe %erse como la gesti(n
de cualquier otro objeto del sistema. /s as" que si se
requiere gestionar usuarios se deber# contar con un
m(dulo de gesti(n de usuarios.
Fuando trabajamos con objetos, el usuario en s"
mismo, no es m#s que un objeto del sistema. /s otro
componente como tantos. , como tal, tendr# su
clase con mtodos y propiedades como cualquier
otra y en una arquitectura QXF, tambin contar# con
su %ista y controlador correspondiente.
Fuando se analiza el total de la aplicaci(n, se puede
obser%ar que un modelo de usuarios, no puede
relacionarse de +orma directa, con ning$n otro
m(dulo del sistema. Be all", la necesidad de dise6ar
un m(dulo independiente para los usuarios. ?ncluso,
aunque ste, tenga solo un modelo.
!i se describen las cualidades del objeto usuario,
respetando de +orma estricta la organizaci(n
orientada a objetos de una arquitectura e incluso, su
paradigma hom(nimo, el usuario no tendr# m#s que
dos propiedades1 la primera e ine%itable, su ?B y la
segunda, su nombre )el usuario es de nombre 5uan*.
. lo sumo, cuando se trabaja con di+erentes ni%eles
de acceso, tendr# un ni%el )el usuario es de ni%el ;*.
/l usuario como objeto, G Ues de contrase6a ni
Utiene una contrase6a. /l usuario, solo debe
ingresar un dato pri%ado para acceder al sistema.
Bicho dato, es conocido como Ucontrase6a y no es
m#s que un requerimiento gr#+ico a los ojos de una
orientaci(n a objetos estricta.
Por este moti%o, la contrase6a )la cual es un dato
pri%ado que solo el propietario debe conocer como si
se tratase del P? de su tarjeta de crdito*, es el
$nico requerimiento gr#+ico que requerir# un
tratamiento especial en el modelo. , ste, G
consistir# en agregar una nue%a propiedad de clase,
sino tan solo, en preparar al mtodo save() para
recibir como par#metro, dicho dato. Pues la +orma
m#s %iable de hacer persistir dicho dato, es
manipulando datos m#s all# del objeto. , a +in de
reutilizar recursos, no debe crearse una nue%a tabla
en la base de datos, sino, apro%echar la destinada a
hacer persistir los objetos &suario.
Por otra parte, debe hacerse notar que el objeto
&suario como tal, tendr# los mismos mtodos que
cualquier otro1 save()- +et() / destro/().
Fuando un acceso restringido sea requerido, ser# el
manejador de sesiones quien entre en juego, pero no
ya manipulando objetos sino datos. Pues la
restricci(n de acceso y el ingreso de contrase6as, no
son m#s que requerimientos gr#+icos que recurren a
Udatos puros para su tratamiento.
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
17
Un mdulo de usuarios es totalmente independiente de
un manejador de sesiones. Solo se aprovecha la base
de datos utili"ada para hacer persistir los objetos, a fin
de evitar la sobre#saturacin de recursos
?ncluso, un m(dulo de usuarios podr"a no ser necesario, si el sistema no requiere su gesti(n y por el contrario,
solo cuenta con el requerimiento gr#+ico de ingresar datos determinados que coincidan con los esperados. /s
el caso de restricci(n de acceso por un $nico nombre de usuario y contrase6a. Para el sistema y a ni%el
arquitect(nico, stos, son solo datos que el Uusuario )no el programador* conoce )o ubica* como nombre de
usuario y contrase6a. . ni%el algor"tmico, son tan solo, dos cadenas de te-to que deben coincidir con las
esperadas.
=CMO SER'A ENTONCES UNA CLASE USUARIO SI LA CLA(E NO ES UNA PROPIEDAD>
!i se desea entonces, contar con un m(dulo de gesti(n de usuarios, no habr# m#s que crear dicho m(dulo.
Las sesiones, son un caso aparte e independiente, ya que ni siquiera interact$an con el o los objetos de este
m(dulo. Repito1 simplemente reutilizan la misma base de datos.
. tal +in, colocar aqu" un t"pico modelo &suario, solo a modo de ejemplo por si la gesti(n de los mismos es
requerida. !i se trabaja con QXF, las %istas y controladores, ser#n como las de cualquier otro modelo.
En Python:
from core<dbla/er import run_:uer/
class Usuario(ob>ect)*
def __init__(self)*
self<usuario_id = 0
self<nombre = ''
def save(self- 59d)*
if self<usuario_id == 0*
s:l = 000$&"#69 $&9% usuario (nombre- p!d)
M8CU#" ('K(u)s'- 'K(p)s')000 K dict( u=self<nombre- p=p!d)
self<usuario_id = run_:uer/(s:l)
else*
s:l = 000UI389# usuario
"#9 nombre = 'K(u)s'- p!d = 'K(p)s'
L4#6# usuario_id = K(uid)i000 K dict( u=self<nombre- p=p!d-
uid=self<usuario_id)
run_:uer/(s:l)
def +et(self)*
s:l = 000"#C#A9 usuario_id- nombre 56%7 usuario
L4#6# usuario_id = Ki000 K self<usuario_id
fields = run_:uer/(s:l)'0(
self<nombre = fields'N(
def destro/(self)*
s:l = 0003#C#9# 56%7 usuario
L4#6# usuario_id = Ki000 K self<usuario_id
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
18
run_:uer/(s:l)
En PHP:
re:uire_once 'coreOdbla/er<php';
class Usuario {
function __construct() {
$this->usuario_id = 0;
$this->nombre = '';

function save($59d) {
if($this->usuario_id == 0) {
$s:l = 0$&"#69 $&9% usuario (nombre- p!d)
M8CU#" ()- ))0;
$data = arra/('ss'- 0{$this->nombre0- 0$p!d0);
$this->usuario_id = 3?%b>ect**e>ecutar( $s:l- $data);
else {
$s:l = 0UI389# usuario
"#9 nombre = )- p!d = )
L4#6# usuario_id = )0;
$data = arra/(0ssi0- 0{$this->nombre0- 0$p!d0- 0{$this->usuario_id0);
3?%b>ect**e>ecutar($s:l- $data);


function +et() {
$s:l = 0"#C#A9 usuario_id- nombre
56%7 usuario
L4#6# usuario_id = )0;
$data = arra/(0i0- 0{$this->usuario_id0);
$fields = arra/( 'usuario_id'=>''- 'nombre'=>'');
3?%b>ect**e>ecutar($s:l- $data- $fields);
$this->nombre = $fields''nombre'(;

function destro/() {
$s:l = 03#C#9# 56%7 usuario
L4#6# usuario_id = )0;
$data = arra/(0i0- 0{$this->usuario_id0);
3?%b>ect**e>ecutar($s:l- $data);


/s necesario aclarar que en QXF, cuando el controlador llame al mtodo save() deber# hacerlo pas#ndole
como par#metro, el dato correspondiente a la contrase6a ya ci+rado.
En Python:
from hashlib import mdP
self<model<save(:d7(5ass9ord)%;e<digest())
En PHP:
$this->model->save(:d7($5ass9ord));
The Original Hacker www.originalhacker.org
2013, 2014 Eugenia Bahit www.eugeniabahit.com Bajo Licencia Creative Commons BY-NC-SA
19
ACE:16I>
Por 7, 5uan deb"a pagar Y; y lo mismo que paga por 7 lo paga por ;. Por 7;, el
precio era de Y7D pero por 7DD, de Y7;. =Zu estaba comprando 5uan>
Ayu!aD que los n$meros no te enga6an. o hay nada que la aritmtica b#sica no pueda resol%er.
Responde AN1ES del 20G0JG2014 a tra%s de 1Kitter utilizando el hashtag LA$erti/o1>?J
E& nom*re !e &os gana!ores ser) #u*&i$a!o en &a siguiente e!i$i'n
La respuesta correcta ser# publicada en 'he Griginal Jac@er [\ junto con los ganadores

S>23C6MN A2 ACE:16I> 7E 1?E >:656NA2 ?ACNE: NOF
ES1A7PS16CAS< 'G'.L B/ R/!P&/!'.!1 22 H FGRR/F'.!1 11 H .F?/R'G!1 F0Q H B/!.F?/R'G!1 F0Q
Para morir el d"a de su cumplea6os n$mero 9D, el hombre tendr"a que haber nacido un a6o antes o muerto un a6o
despus ya que al no haber e-istido un a6o cero, muri( el d"a de su cumplea6os n$mero 8K.
Como pro$ramadores, el ra"onamiento lateral #entre otras cosas# nos a%uda a
aislar el verdadero problema del conte&to descartando as', a!uella informacin
!ue a pesar de aparentar ser de inter(s, resulta irrelevante para la solucin del
problema El acertijo nos lo demuestra con los datos sobre la hora de nacimiento
% fallecimiento Puede parecer interesante pero si sabemos !ue no es matem)tico
el c)lculo *es entonces un dato relevante+
...porque no existi el ao 0, ste, es el
:ANN6N5 7E 5ANA7>:ES 7E2 LA$erti/o1>?F
P:60E:A :ESP3ES1A
C>::EC1A
!suario que dio la "# respuesta correcta en su primer intento
]micodwar+t
)+elic"talo por su respuesta*
:ESP3ES1A 0EI>:
A:530EN1A7A
$espuesta que mejor ha explicado el acertijo
]diegodela%ega
)+elic"talo por su respuesta*
>1:>S 5ANA7>:ESD
]3rn3st0, ]$huso, ]neomatheKs, ]0i$4yRCarras$o, ]imon$&us, ]r#&a, ]mta#iag1, ]*en/asCa+%ue+ y ]santararo
tambin merecen ser +elicitados por haber acertado en la respuesta 1*
Programar es saber aislar el problema descartando lo irrelevante
/l KCL de las personas estudia para ampliar sus conocimientos.
Pero tu, puedes ser parte del otro 8L.
w w w . $ u r s o s d e # r o g r a m a $ i o n a ! i s t a n $ i a . c o m
c l a s e s i n d i % i d u a l e s ^ p e r s o n a l i z a d a s
p a r a e l 8 L q u e b u s c a l l e g a r m) s a & & ) ! e & $ o n o $ i mi e n t o
FREE AS IN FREEDOM
LA (ERDADERA <TICA HACKER
ecesitamos %i%ir en un mundo donde el acceso al $ono$imiento sea 26B:E2 donde la so&i!ari!a! con el %ecino G sea 62PC61A. Bebe dejar de condenarse el
compartir conocimiento con nuestros seres queridos y allegados. EB C!D"0 e1$E en $u1 D!n01, #!y DuC#0 Fue Gue4e1 #!Ce2+
DILE A MO&ILLA *UE NO
INCORPORE EL DRM DE
ADOBE A FIREFO%
!(lo una semana despus del B"a
?nternacional contra el BRQ, 0o+i&&a
anun$i' %ue a#oyar) &a 5esti'n
7igita& !e :estri$$iones en su
navega!or Sire(o,, el cual tendr# una
utilidad incorporada que obtendr# e
instalar# autom#ticamente los BRQ de
.dobe.
ENCPA2E 3N E-0A62 A AN7:EAS 5A2
)F'G de Qozilla* hacindole saber que te
opones al BRQ.
CANCELA TU CUENTA EN
NETFLI% HYO LO HICEI
Jace un a6o atr#s, enterada de que
Net(&i, so&o #ermitir8a &a
re#ro!u$$i'n !e v8!eos en
navega!ores extensiones
premium Tas8 &&amaron a& 7:0E
cancel mi suscripci(n anual =por qu>
Porque la libertad de toda una
comunidad B/B/ %aler m#s que
cualquier serie JB.
.FF/B/ . '& F&/'. B/ /'ML?V y
ENCPA2ES 3N 0ENSAIE
CANCE2AN7> 13 S3SC:6PC6MN.
Anun$ia tu !e$isi'n en 1Kitter y tus
redes sociales.
NO USES DISPOSITI(OS
*UE PROHIBEN COMPARTIR
TUS PROPIOS ARCHI(OS
CON LIBERTAD
HYO NO LOS USOI
Ama+on Nin!&e, iPa!, iPo!, iPhone y
dem#s dispositi%os de .pple incluyen una
Aesti(n Bigital de Restricciones que !aUa
&a &i*erta! !e &as #ersonas.
Bispositi%os con .ndroid _tambin son
peligrosos`
VN> 2>S 3SESW
UTILI&AR SOFTWARE PRI(ATI(O O DISPOSITI(OS CON RESTRICCIONES
Y DECIR *UE APOYAS EL SOFTWARE LIBRE, ES CINISMO+
UN HACKER <TICO ES A*UEL *UE ES COHERENTE CON LO *UE DICE Y HACE+
HACKTI(ISMO <TICO
LAS SIGUIENTES COMPA?'AS HACEN DA?O A LA LIBERTAD DE LAS PERSONAS
Los siguientes logotipos yHo isotipos son propiedad registrada de cada una de las empresas mencionadas y se utilizan en este a+iche sin permiso de las mismas.
Qediante sus plata+ormas
Iindle y Prime. 2eer m)s "
.pple utiliza el BRQ para controlar
iG! y a los usuarios de G! V.
2eer m)s "
/l BRQ se incorpora en el coraz(n de
Eindows y muchos ser%icios como
!il%erlight, imponen el BRQ en los
usuarios. 2eer m)s "
o satis+echo con el uso de BRQ para su ser%icio de
streamin%, ahora et+li- est# tratando de imponer el
BRQ en la Eeb. 2eer m)s "
!ony ha utilizado acciones legales para hostigar e
intimidar a las personas que han modi+icado sus
sistemas P!9. 2eer m)s "
SI DE (ERDAD APOYAS EL SOFTWARE LIBRE, JSALO, PROMU<(ELO Y ABANDONA LO PRI(ATI(O SIN
E%CUSAS+ EL CAMBIO EST9 EN TUS MANOS+
1405301135816
1405301135816
6

También podría gustarte