📝💻 Creación de funcionalidad de rejectlist como ejercicio de programación - Parte I: capa de datos
📝💻 Creación de funcionalidad de rejectlist como ejercicio de programación - Parte I: capa de datos
Por Enio...
En informática, la lista negra se refiere a una compilación de entidades que serán discriminadas de participar en algún proceso o servicio. Tales entidades usualmente consisten en direcciones de correo, nombres de usuario, contraseñas, direcciones web (URLs), nombres de dominio, direcciones IP, etc. La idea es que el software que lee esta lista de algún modo ignorará o dará trato diferente o limitado a tales entidades, y si el software es parte de los servicios ofrecidos por una empresa u organización cualquiera, el significado se hará notorio en el alcance de ese servicio.
De hecho, en Internet las listas negras originalmente se inventaron y promovieron para registrar y filtrar aquellos computadores conectados a la red que generan correo no deseado o spam. Esto se logra generalmente filtrando desde nuestros servidores de correo a ciertas direcciones IP (ejemplo: 186.166.241.166) o también nombres de dominio (ejemplo: https://www.cientoporcientospam.com). Una de las compilaciones de listas más conocidas es el Domain Name System Blacklists (DNSBL's) cuyos antecedentes datan de 1997.
Al día de hoy, ese sigue siendo el mejor ejemplo e instancia de la funcionalidad de lista negra, pero un caso más corriente lo sería una escuela o institución que, a través de su dependencia informática y de redes, limita el acceso a ciertas páginas de pornografía u otras desde los computadores conectados a su red. Otro ejemplo con el que quizá estemos también familiarizados es el de un famoso bot de Steem que hace su esfuerzo por detectar a quienes incurren en plagio, spam, etc., añadiéndolos a su lista negra.
Como se ve, parece que la idea de la lista negra es razonable, pues desde un punto de vista técnico y práctico busca proteger a un servicio contra contenidos no deseados, accesos no autorizados y prácticas abusivas, lo que termina por convertir a sus generadores en fuentes no deseadas para quien implementa la lista. Esta puede interpretarse entonces como un mecanismo de arquitectura de seguridad de todo el sistema.
Sin embargo, la discusión sobre la connotación positiva o negativa de las listas negras está más bien abierto, puesto que hablamos de una tecnología ambigua y que tiene muchas veces consecuencias más allá de lo meramente técnico, con repercusiones legales, sociales, de negocios, etc.
Algunas veces las razones de existencia de las listas negras son imposiciones de la ley, directivas del Estado o políticas empresariales. Han existido disputas legales sobre si estos mecanismos son causa de discriminación y abuso, tales como los bloqueos de páginas web por parte del proveedor de Internet, y afectan la libre competencia de las empresas, como los filtros aplicados por los motores de búsqueda a páginas de descargas, etc. y en cierta medida, algo como el famoso caso de Google y Huawei por causa de una lista negra comercial.
Por otra parte, si lo pensamos un poco, tampoco deberíamos pasar por alto que "negra" es un calificativo poco apropiado en términos de lenguaje y sociedad, pues, como pasa a menudo en nuestra vida social, se relaciona lo negro con lo malo o lo no deseado (¿racismo?).
Curiosamente, el concepto y mecanismo de "lista blanca" también existe y representa lo autorizado, lo deseado, justamente lo contrario a la lista negra, y ello pasa así en muchos idiomas (por ejemplo, en inglés: blacklist y whitelist). Especulo con que los psicólogos analíticos llamarían a nuestra obsesión por asociar lo bueno con lo blanco una especie de "arquetipo". En todo caso, creo que deberíamos usar el término existente alternativo, es decir, hablar mejor de "lista de rechazo" (rejectlist) que de lista negra (blacklist). Es el término que usaré a partir de ahora en este artículo.
Sobre el artículo, precisamente, su carácter se tornará ahora en adelante más técnico, puesto que su propósito es explicar el desarrollo de una funcionalidad de lista de rechazo teniendo en perspectiva la ingeniería de software. La idea es crear una implementación para un caso de uso relacionado con esta funcionalidad, lo cual detallaremos en un ulterior artículo. De momento, en este primer post me enfocaré en preparar la capa de datos, es decir, crear una base de datos para la funcionalidad.
El ambiente tecnológico que he delimitado comprende al lenguaje de programación Javascript (variando un poco mis anteriores entregas de programación con mi favorito Python) a través de Node.js, que es el entorno de ejecución de Javascript para el servidor y que actualmente se ha hecho bastante popular y demandado en el campo.
También, para la implementación de la capa de datos he escogido MongoDB, una de las mejores propuestas de las base de datos no relacionales, sino orientadas a documentos. La implementaré a través del módulo mongoose de npm.
En cuanto al diseño de esta solución, está compuesta de los siguientes pasos:
1. Especificaciones de la listas
Para este ejercicio, las entidades que conformarán la lista de rechazo serán nombres de usuarios. Se supone que la lista es para limitar el acceso de esos usuarios a los servicios de un sistema en particular.
2. Obtención de la lista de usuarios iniciales
Asumiremos que la base de datos no estará vacía de antemano, sino que será creada con algunos registros o documentos previos. En ese sentido, utilizaré como referencia un conjunto de listas ya existentes con antelación y públicamente disponibles en Internet en formato JSON. Para ello, utilizaré el módulo https
con el cual no quiero montar un completo servidor HTTP sino básicamente usarlo para descargar el mencionado fichero. Dejemos que el script lo explique:
La fuente es un archivo JSON de las "listas blanca, negra y gris" de @SteemSTEM. Recientemente tuve el honor de colaborar con este proyecto en términos de programación, y estos ejemplares me parecen idóneos. Para los conocedores del módulo HTTP, sabemos que el método get
hará la descarga del contenido de manera gradual en el evento data
(línea 12 y 13) y luego se parsea manualmente a formato JSON una vez completada la descarga (línea 18).
3. Creación de la base de datos y la colección
A continuación, defino una la función InsertarMiembros
que será llamada vía callback por el script anterior (línea 21). En ella primeramente definiré un modelo para representar los documentos a almacenar en la colección:
Como se observa, se ha usado la clase Schema
del módulo mongoose
, ideal para definir las especificaciones de la colección. En este caso, constará con dos campos: 1) username
de tipo String
el cual contendrá el nombre de usuario, y 2) lista
, también String
, que está pensado para tener tres posibles valores: ‘blacklist’, ‘whitelist’ o ‘greylist’. Sería el tipo de lista en el que esté clasificado el usuario.
4. Inserción de usuarios en la colección
El resto de la función InsertarMiembros
registra físicamente los usuarios en la colección, creando de esa forma los documentos o registros:
Definimos un arreglo miembros
(línea 44) que se llena con instancias de ModeloMiembro
, creadas a partir de los datos contenidos en nuestro objeto JSON obtenido en pasos previos (nombre de usuario y tipo de lista a la que pertenece) (ĺíneas 61, 68, 75). Ese arreglo es insertado en la base de datos a través del método insertMany
de Mongoose (línea 81).
La ejecución de este script debe dejarnos una base de datos MongoDB con una colección que contiene los nombres de usuarios que serán protagonistas de la funcionalidad de lista de rechazo por programar (ver imagen 4). No obstante, sería interesante a modo de ejercicio completar el script con una rutina que valide los nombres de usuarios aquí existente. En este caso es posible lograrlo, ya que se trata de usuarios de Steem, y esta blockchain posee una API pública que nos permitiría comprobarlo. Lo dejaré de tarea para mis lectores programadores :)
Nos vemos en la próxima entrega donde implementaremos una solución al caso de uso de esta lista de rechazo, completando la capa de datos y de lógica de negocios. Si tienes alguna duda o aporte, no dudes en comentarlo.
MATERIALES DE REFERENCIA
Si estás interesado en más temas sobre Ciencia, Tecnología, Ingeniería y Matemáticas (STEM, siglas en inglés), consulta las etiquetas #STEM-Espanol y #SteemSTEM, donde puedes encontrar más contenido de calidad y también hacer tus aportes. Puedes unirte al servidor de Discord de STEM-Espanol para participar aún más en nuestra comunidad y consultar los reportes semanales publicados por @STEM-Espanol.
Créditos: @IAmPhysical
Créditos: @Eniolw
NOTAS ACLARATORIAS
- La imagen de pie es de @CarlosERP-2000 y @IAmPhysical y es de dominio público.
- A menos que haya sido indicado lo contrario, las imágenes de esta publicación han sido elaboradas por el autor, lo que incluye la imagen de banner, creada con base en imágenes de dominio público.
Blacklist y whitelist son de uso amplio y pueden ser convenientes según el entorno, así como en la plataforma Steemit se habla mucho de una blacklist para marcar cuentas en especifico, muchas veces en sistemas de comunicación el proceso es inverso y se usan whitelist, donde se rechaza a todo aquel que no este en la lista. Proceso que en sistemas empresariales se consideran muchas veces más efectivos cuando son por ejemplo direcciones IP las que se bloquean o permiten y se desea reducir el abanico de posibilidades de conexión a un número limitado y evitar dejar filtraciones al reducir al mínimo el número de posibles conexiones. Las listas son un tema que aún cuando viene usándose desde hace mucho tiempo siguen siendo de gran efectividad. Espero por la segunda parte.
Buen aporte. Gracias por comentar.
Una publicación necesaria para dar a conocer la importancia de estas listas con las que por cierto, también me encuentro en desacuerdo con su nombre por su carácter discriminatorio.
Sí, son necesarias estas lista dada su condición de protección a los creadores de contenidos. Sin embargo, en algunos casos, suelen ser destructivas.
Ningún caso donde se reconozca el plagio intencional debería ser negociado, en ese sentido, la lista rechazo estará diseñada para bloquear toda acción invasiva. Pero, ¿se podría dar el caso de clasificar el tipo de plagio?
Pudiésemos decir ¡plagio es plagio! y afirmar que la acción no tiene nivel de discriminación, válido. Aún así me surge la duda.
En el caso de steemit, incorporar a los usuarios radicalmente en una lista de rechazo sin avenencia no sé si sea la acción correcta. A mi juicio deben darse señales de alerta 1 o 2 veces como máximo y desde allí verificar la intencionalidad el los usuarios.
Felicitaciones por este trabajo que muestra transparencia en un proceso necesario por el bien de todos. Saludos.
Sí, hay personas que cometen plagio insconscientemente, pero deberían tener un poco de sentido común.
Por otra parte, en el caso del bot Cheetah, según sus creadores, este "vota los posts como señal de buena voluntad". Si no ha sido un error del bot que haya señalado al usuario de usar contenidos ya existentes en la red, el usuario debe entender la seña y evitar ser señalado en el futuro. Por el contrario, si la ignora y sigue incurriendo en la falta y recibiendo el comentario de Cheetah, eventualmente será denunciado e incluido en su lista negra.
Gracias por tu valoración!
A esto me refiero, creo que ese trabajo de Cheetah es importante porque obviamente te alerta y eso como dices, si se hace caso omiso pues ya no hay forma de quejarse. Yo igual defiendo el derecho de autor, es un tema sin discusión. Éxitos en tu proyecto.
Super interesante la creación de la Base se Datos, estaré atenta aunque confieso que debo fortalecer el área con estos entornos. En cuanto a la existencia de estas listas he notado que son usadas hasta como forma de imponer un poder y en manos equivocadas a veces pueden ser destructivas al ser tomadas de forma personal. Totalmente de acuerdo en el término racista.
Es bueno aprender. Gracias
Posted using Partiko Android
Me alegra le haya gustado. Gracias por la visita!
Excelente publicación, saludos @eniolw
Muchas gracias, estimado!
This post has been voted on by the SteemSTEM curation team and voting trail. It is elligible for support from @curie and @utopian-io.
If you appreciate the work we are doing, then consider supporting our witness stem.witness. Additional witness support to the curie witness and utopian-io witness would be appreciated as well.
For additional information please join us on the SteemSTEM discord and to get to know the rest of the community!
Thanks for having added @steemstem as a beneficiary to your post. This granted you a stronger support from SteemSTEM.
Thanks for having used the steemstem.io app. You got a stronger support!
Thanks!
Hi @eniolw!
Your post was upvoted by Utopian.io in cooperation with @steemstem - supporting knowledge, innovation and technological advancement on the Steem Blockchain.
Contribute to Open Source with utopian.io
Learn how to contribute on our website and join the new open source economy.
Want to chat? Join the Utopian Community on Discord https://discord.gg/h52nFrV
Awesome!