垃圾邮件防护如何在Stack Exchange上起作用?

发布于:2020-12-24 16:13:01

0

68

0

垃圾邮件 Stack Exchange 安全性

如果您在互联网上放置一个文本框,则有人会将垃圾邮件放入其中。 如果将文本框放置在每天获得数百万点击的网站上,那么很多人都会在其中放置大量垃圾邮件。 如果您在该站点上放置了很多文本框,那么您便明白了。

垃圾邮件防护就像食人魔一样-它具有层次

许多大型Web应用程序是分层部署的。当您的浏览器向bigsite.example.com发送HTTP请求时,它可能首先遇到CDN(例如Cloudflare),然后转发到代理或负载均衡器,然后转发到单个服务器,这可能又具有反向代理,然后是Web服务器,然后您的请求才会真正发送到应用程序本身。我不会详细介绍Stack Exchange的部署方式,因为Nick Craver可以比我更好地解释它。

这些层中的每一层都可以调整以帮助阻止垃圾邮件。如果您使用Cloudflare,则无需考虑即可为您提供大量自动垃圾邮件防护;还有许多其他CDN也会这样做。负载均衡器可以添加一个简单的IP阻止机制。反向代理可以配置为丢弃来自可疑来源的请求,而这一切都可以在构建内置更复杂保护措施的应用程序之前完成。

Stack Exchange利用了许多这样的层来帮助缓解垃圾邮件问题。为了避免绕过他们太容易,其中一些是故意隐秘的。其他人则更多是公众知识。我在这里谈论的是比较公开的部分,通常位于请求路径的较低层。

不幸的垃圾邮件发送者收到HTTP错误

如果有一天我突然决定走上一条新的职业道路,并试图让我的财富向Stack Exchange发出垃圾邮件,那我可能会以为我只是复制发布新问题时发生的HTTP请求并编写一些代码而开始在每个帖子中对垃圾邮件进行快速重复。

我会是一个不幸的垃圾邮件发送者,因为我很快就会达到垃圾邮件保护的第一级:429。对于不熟悉HTTP状态代码的人,429是太多请求。这里的阈值是故意不公开的,但是当Stack Exchange注意到您发送了太多请求以至于无法人工处理时,它将切断您的发送并向您发送此迷人的消息:错误页面的屏幕快照,标题为“ Too many requests”,其中包含有关发出的HTTP请求以及遇到此阻止原因的信息。

现在,鉴于我已经编写了一些代码来执行此操作,可能是我永远不会看到该错误页面,并且我的脚本将继续运行……等等。在某个时候,Stack Exchange SRE可能会四处查看,并确定我是害虫,然后(示意性地)将我的IP中的任何请求路由到/ dev / null。

我可能会注意到。“但是,哈哈,”我听到你说,“你可以得到一个新的IP!”我可以的,直到我也被禁止了。“但是啊哈,您可以只使用Tor!”从表面上看,这听起来像是个好主意,直到您意识到Tor出口节点的列表是公开的,并且不会很快改变。换句话说,Stack Exchange可以告诉您何时使用Tor,如果您是害虫,可以简单地…关闭Tor访问。

幸运的垃圾邮件发送者无论如何都会遭到IP阻止

HTTP请求发送到Stack Exchange应用程序后,任何潜在的垃圾邮件发送者都会遇到另一个障碍:SpamRam。

SpamRam是Stack Exchange的定制垃圾邮件防御系统。它会监视所有收到的新帖子,可疑地斜视他们,以决定它们是否为垃圾邮件,如果是,则将其删除6条。真的很擅长:垃圾邮件被屏蔽与垃圾邮件标记的图表(2014年3月2日至4月1日),显示了3月28日受垃圾邮件的明显峰值,而标记的垃圾邮件则保持不变

诚然,这是一个古老的图表,但它表明SpamRam甚至在打到网站之前就已经摆脱了垃圾。

之所以如此出色,部分原因在于,一旦识别出垃圾邮件,它就会直接进入IP阻止机制。如果某个帖子被视为潜在的垃圾邮件而被阻止,则来自该IP地址的IP地址可能会被完全阻止,陷入混乱(即严格限制速率)或被阻止发布-这就是“由于垃圾邮件/滥用源于您的网络”消息,有关不时出现在元数据上的投诉。

那橙色线呢?这就是通过的内容,即用户实际看到的垃圾邮件。这些帖子被用户标记为垃圾邮件,它们还会反馈到SpamRam中,并再次帮助通知IP阻止。主持人采取的措施可以帮助推动系统发展-主持人当然也可以标记垃圾邮件,但他们也可以销毁用户,并特别声明他们这样做是因为用户是垃圾邮件发送者,这向SpamRam强烈表明它来自的IP地址是个坏消息。

那么人们如何找到要标记的帖子?这就是最后一点。

真正幸运的垃圾邮件发送者会被垃圾邮件标记致死

如果你是一个狡猾的,鬼鬼祟祟的,非常幸运的垃圾邮件制造者,你可能会通过一些垃圾邮件,并成功地登陆到一个网站而不被阻止。恭喜你!现在你到了最后一道防线——社区的防御机制。

我提到过垃圾邮件攻击——任何超过15的人都可以这么做。如果你在浏览网站时看到了垃圾邮件,你可以用垃圾邮件标记它。六个垃圾标志会自动删除帖子,将其标记为垃圾邮件(包括隐藏内容),并将其和作者发送到SpamRam。

这依赖于人们在随意浏览时看到垃圾邮件。在大多数情况下,这是非常有效的,特别是在高流量的网站,但特别是在较小的网站,垃圾邮件可以停留一段时间,直到它收集到足够的标志。幸运的是,社区中的一些人很久以前就认识到了这个问题,并开始了一个旨在解决这个问题的项目。输入:carbon是运行烟雾探测器的组织,从根本上说,烟雾探测器是一个寻找垃圾邮件并将其输入聊天室的机器人,等待的用户可以跟踪链接并标记垃圾邮件。

从技术上讲,它是通过监听栈交换websocket并请求用于提供实时页面的相同动作来实现这一点的。这让我们得到每一个新的和编辑过的问题或答案,在网络上无处不在。每个帖子都会被扫描,这包括对其内容进行大量的正则表达式和一些启发式测试,看看是否有结果为真。当然,绝大多数都不是垃圾邮件,但还有相当一部分是垃圾邮件——而且那些被贴上聊天标签的垃圾邮件会被标记为不光彩。

这样做意味着我们捕捉到很多不是垃圾邮件的帖子(误报)。这很好——因为在标记每一篇文章之前都有一个人在检查,我们的目标不是0%的假阳性率,而是0%的假阴性率——换句话说,我们试图不遗漏任何垃圾邮件,即使这意味着偶尔会错误地将一篇好文章识别为垃圾邮件。

但有时,人类还不够。不管垃圾邮件被标记和删除的速度有多快,总会有更多的垃圾邮件被删除。垃圾邮件通常是一波又一波的出现,在高峰时,垃圾邮件的数量可以轻易地压倒人类的恶意攻击者,需要花费一些时间来追赶并删除所有的垃圾邮件。也就是说,这里有一个主题,也有一个解决方案。

武装机器人并将其放开

当标记变得越来越困难时,就会变得困难……将控制权交给计算机,让它们来完成工作。

当Smokey判定帖子为垃圾邮件时,会将其发送到我们的Web仪表板metasmoke。 Metasmoke是最初非常简单的应用程序之一(只需记录帖子即可),但是随着时间的推移,它逐渐发展起来,现在可以处理很多东西。像这样的东西:

  • 记录帖子

  • 记录帖子获得的任何反馈-肯定,否定,不是答案等。

  • 运行审阅队列以获取对尚未有人看过的帖子的反馈

  • 记录和分类已用于垃圾邮件的网站

  • 协调多个SmokeDetector实例并管理故障转移

  • 显示所有漂亮的图

  • 托管其他功能的API(例如用户脚本)以与其集成

  • 也许最重要的是运行自动标记。

2016年11月至12月,我们在metasmoke中构建了一个系统,以识别最有可能成为垃圾邮件的帖子。我们在空运行下测试了一段时间(不投放任何标志),然后再次测试,投放标志使用一名幸运的受害者志愿者的帐户。它超出了我们的期望-准确度很高,并且几乎捕获了所有明显的垃圾邮件。 2月,我们公开发布了该系统,其中包括呼吁举报者将其标志借给我们,即使用metasmoke进行签名,以便该系统可以以其名义举报帖子。此后不久,我们将系统从在每个帖子上投射单个自动标志,移动到在每个帖子上投射三个自动标志。

实际上,木炭和SmokeDetector是Stack Exchange上抵御垃圾邮件的最后一道防线。 将所有这些系统结合在一起,Stack Exchange在保护自己免受垃圾邮件侵害方面做得非常好。

下一个是什么?

对于堆栈交换? 谁知道—垃圾邮件检测系统始终可以做出改进。 为了木炭? 我们将继续调整系统并更新我们的检测规则,始终在寻找更多要删除的垃圾邮件。

如果您想了解有关木炭的更多信息,则可以浏览网站,我们的GitHub组织或与我们聊天。 我们一直在寻找新面孔为您提供帮助-无论您只是有兴趣还是希望自己可以从事下一个重要功能,我们都希望拥有您。