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:
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.
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).
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.
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.
NOTAS ACLARATORIAS