我为我的博客添加了实时聊天,人们用它来攻击我
有时,项目中最不相关的部分反而成为绝对的主角。我的博客有一个小的社交小部件,漂浮在一侧。你可以在桌面上看到它在右侧,在手机上则在左侧。它实时告诉你有多少人正在阅读该网站,并允许你给在场的其他人发送一条简短的消息。它非常基础。没有历史记录,你也不需要创建帐户或个人资料。一条消息出现后,几秒钟后就消失了。它是一种装饰,一个眼神,像是你在周五下午添加的细节,期待做出的反应少之又少。令我惊讶的是,它被用来抹黑我并审查了一篇文章。让我给你一个背景。我写了一篇关于为什么我不推荐Tailwind CSS的文章,并在Hacker News上分享。几分钟内,文本框就充满了攻击性的和挑衅性的消息,有些甚至试图冒充我。它是如何工作的,我几乎不用做任何事情,这项肮脏的工作是由网站架构完成的。我的网站是一个单页应用(SPA),在服务器上呈现HTML,并通过WebSocket发送到浏览器(我使用的是Django LiveView,我自己的框架)。以这种方式工作时,了解实时连接人数是免费的。每个访客保持着一个打开的连接,所以我有一个实时连接的表。当有人加入或离开时,我向在场的每个人广播新数字,计数器会自动更新。从那里开始,添加一个输入框并将某人所写的信息传递给其他人只是小事一桩。我已经用来显示计数的同一个频道也可以用来传递消息。我为它设置了经典的限制,没有过于复杂的内容:每条消息的最大字符数。消息在几秒钟后消失。你不能连续发送消息:每条消息之间有一个最小间隔。从原则上来说,这似乎相当可靠。只有传递简单、短暂的文本的框对我有什么伤害呢?你也在想我当时想的事,我不是疯了,对吧?攻击结果表明,一个与每个读者同时连接的公共文本框是一种不可抗拒的玩具,激发了创造力:侮辱和仇恨言论。种族主义和各种挑衅。我猜目标是双重的:让阅读的人感到不舒服,并在聚合器和分享网络面前抹黑这篇文章。针对性的挑衅。有一个特定的总统被提到很多,还有死亡威胁。我想这是针对某个特定社交网络或社区。覆盖内容。非常长的消息,重复的字符,#和@连着出现,以推动文本向下,混乱屏幕。在手机上效果出奇的好。冒充我。他们开始发送假装是我的消息,邀请人们访问特定链接或发送垃圾信息。总有人想从噪声中获利。注入代码。许多人试图悄悄地植入JavaScript,以便在其他人的浏览器中运行。他们从来没有成功,但这个尝试是有趣的。因为服务器会先渲染和转义HTML,然后再广播,所以一个<script>作为无效文本传送,趋向于邻居的屏幕,看起来只是几个字母,而不是真正的代码。使聊天功能变得简单的相同结构使其免受这种攻击。公开抹黑我。还有最简单的一种:对我或我的博客表达轻蔑的消息,只是想看看有没有效果。我肯定让很多人同时感到愤怒,因为攻击的浪潮持续了一整天。持续攻击。也许是由AI或机器人执行的,我不知道。攻击的规模如此之大,以至于我开始收到私人警告。这是前所未有的!对策第一个也是最明显的对策是一个不当词汇和表达的过滤器。我不会解释哪些词或它的内部工作原理,显而易见,但它是相当有效的。机器的运行在于启发式。第二个,也是最自然的,就是将每条消息的最大字符数削减。更少的空间意味着更少的弹药来覆盖内容和隐藏链接。剩下的就是所有反制措施中最困难的:耐心和不上当。巨魔追求反应。如果系统以沉默的方式吸收一击,而你没有回应,对攻击者来说游戏就不再有趣了。不要喂养巨魔。我所学到的简单结论可能是“有很多人都拥有太多自由时间。”这是真的。但是还有几件不那么明显的事情我会铭记在心。每个输入都充满敌意,直到证明相反。这是我们开发者反复强调的一个信条,直到你经历过这样的事情,你才会完全内化它。实时审查是另一个问题。审查评论是舒适的:评论到达,等待,你审核,决定。一条瞬间广播的短暂消息并没有给你这样的余地。你要么信任在毫秒内操作的自动过滤器,要么就来不及了。由于攻击者即兴发挥,这种不对称是残酷的。
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡