Añadí un chat en tiempo real a mi blog, y lo usaron para atacarme
A veces la pieza más irrelevante de un proyecto se convierte en su protagonista absoluta.
En mi blog hay un pequeño apartado social flotando en un lateral. Lo puedes ver a la derecha en escritorio, a la izquierda en móvil. Te dice cuánta gente está leyendo la web en tiempo real, además de dejarte lanzar un mensaje corto para que lo vean el resto de presentes. Es muy básico. No tiene historial ni hace falta crearse una cuenta o perfil. Un mensaje aparece y a los pocos segundos desaparece. Es un adorno, un guiño, la clase de detalle que añades un viernes por la tarde y del que no esperas nada. Para mi sorpresa, lo usaron en mi contra para desprestigiarme a mí y para censurar un artículo.
Os pongo en contexto. Escribí un artículo sobre por qué no recomiendo Tailwind CSS y lo compartí en Hacker News. En cuestión de minutos, la caja de texto se llenó de mensajes ofensivos y provocativos, algunos incluso intentando suplantarme.
Cómo funciona
No tuve que hacer prácticamente nada, y el trabajo sucio lo hizo la arquitectura de la web.
Mi web es un SPA que renderiza el HTML en el servidor y lo manda al navegador por WebSockets (uso Django LiveView, mi propio framework). Cuando trabajas así, saber cuánta gente hay conectada en tiempo real sale gratis. Cada visitante mantiene una conexión abierta, así que solo tengo una tabla con las conexiones vivas. Cuando alguien entra o se va, difundo (broadcast) el nuevo número a todos los presentes y el contador se actualiza solo.
Desde ahí, añadir un input y retransmitir lo que alguien escribe a todos los demás es un paso pequeño. El mismo canal que ya uso para el contador me sirve para el mensaje.
Le puse límites clásicos, nada excesivamente sofisticado:
- Un máximo de caracteres por mensaje.
- El texto desaparece de la pantalla a los pocos segundos.
- No puedes enviar mensajes seguidos: hay un intervalo mínimo entre uno y otro.
En principio parece bastante sólido. ¿Qué problemas puede darme una caja que solo difunde texto plano y efímero? Piensas igual que yo, no estoy loco, ¿verdad?
Los ataques
Resulta que una caja de texto pública conectada a todos los lectores a la vez es un juguete irresistible que dispara la creatividad:
- Insultos y expresiones de odio. Racismo y provocaciones varias. El objetivo, supongo, era doble: incomodar a quien estuviera leyendo y dejar el artículo mal ante los agregadores y redes donde se estaba compartiendo.
- Provocaciones dirigidas. Se mencionaba bastante a cierto presidente con amenazas de muerte. Supongo que iba dirigido a una red social concreta o comunidad.
- Tapar el contenido. Mensajes larguísimos con caracteres repetidos,
#y@en cadena, para empujar el texto y ensuciar la pantalla. En móvil era sorprendentemente efectivo. - Suplantarme. Empezaron a escribir mensajes haciéndose pasar por mí, invitando a entrar en ciertos enlaces o metiendo spam. Siempre hay quien quiere sacar tajada del ruido.
- Inyectar código. Muchos intentaron colar JavaScript para que se ejecutara en el navegador del resto. Nunca lo lograron, pero el intento es interesante. Como el servidor renderiza y escapa el HTML antes de difundirlo, un
<script>viaja como texto inerte y llega a la pantalla del vecino como lo que es, unas letras, no como código. La misma arquitectura que hace el chat trivial es la que lo hace inmune a esto. - Desprestigiar de frente. Y el más simple, mensajes de desprecio hacia mí o hacia el blog, a ver si colaba.
Debí molestar a muchas personas a la vez, porque la oleada duró un día entero. Unos ataques continuados. Tal vez ejecutados por IAs o bots, no lo sé.
Tal fue la magnitud que empecé a recibir avisos por privado. ¡Algo inaudito!
Las contramedidas
Lo primero, y más obvio, fue un filtro de palabras y expresiones inapropiadas. No voy a explicar cuáles son ni cómo funciona por dentro, por razones evidentes, pero es bastante efectivo. La maquinaria está en la heurística.
Lo segundo, y más natural, fue recortar mucho el número máximo de caracteres. Menos espacio es menos munición para tapar contenido y menos sitio donde esconder un enlace.
El resto es la contramedida más difícil de todas: paciencia y no entrar al trapo. Un troll busca reacción. Si el sistema absorbe el golpe en silencio y tú no respondes, el juego deja de ser divertido para el que ataca. No hay que alimentar a los trolls.
Lo que aprendí
La conclusión fácil sería "hay mucha gente con demasiado tiempo libre". Y es verdad. Pero hay un par de cosas menos obvias que me llevo.
Todo input es hostil hasta que se demuestre lo contrario. Es un mantra que repetimos los desarrolladores y que interiorizas de golpe el día que vives una situación similar.
La moderación en tiempo real es un problema distinto. Moderar comentarios es cómodo: llegan, esperan, los revisas, decides. Un mensaje efímero que se difunde al instante no te da ese margen. O confías en un filtro automático que actúa en milisegundos, o llegas tarde. La asimetría es brutal, ya que un atacante improvisa en segundos, pero la contramedida tarda horas o días.
Lo efímero juega a tu favor. Que el mensaje desaparezca solo, que no haya historial, que no queden perfiles ni karma que farmear, le quita casi todo el incentivo a un troll.
Para ir terminando la anécdota, solo quiero decir que no me arrepiento de tenerlo. La inmensa mayoría lo usa para saludar, y ver a diez desconocidos coincidir en la misma página a la vez sigue teniendo algo de magia.
¿Tienes compañía? Aprovecha para saludarle, o incluso empezar una amistad. Nunca sabes quién está al otro lado de la pantalla.
This work is under a Attribution-NonCommercial-NoDerivatives 4.0 International license.
Will you buy me a coffee?
This is how I keep writing without ads or paywalls.
Sure, it's on me!
Comments
There are no comments yet.