如何最好地惩罚垃圾邮件发送者?我对这个话题进行了很多思考,因为我花了很多时间来筛选他们发给我的无穷无尽的垃圾。那时我才恍然大悟:惩罚应该与罪行相称——剥夺我的时间——这意味着我反过来也需要剥夺他们的时间。当然,我的时间开销尽可能小。因此,今年早些时候, 我创建了 Password Purgatory ,其唯一目标是让垃圾邮件发送者通过试图满足真正令人讨厌的密码复杂性标准的地狱环境。我的意思是非常讨厌的标准,比你以前见过的更糟糕。我开源了它,拿了一堆 PR,构建了 API 来呈现越来越空洞的密码复杂性标准,然后就这样了。直到现在,因为最后,它是活的,工作的,而且非常漂亮?
第 1 步:接收垃圾邮件
这很简单——这一步我不需要做任何事情!但让我把它放在上下文中,给你一个真实世界的例子:
啊。讨厌的东西,对他们来说是地狱,这一切都始于将垃圾邮件归档到一个名为“将垃圾邮件发送到密码炼狱”的特殊文件夹中:
这就是在逐个垃圾邮件的基础上所涉及的工作范围,但让我们揭开面纱,看看接下来会发生什么。
步骤 2:触发 Microsoft Power Automate 流
Microsoft Power Automate (以前称为“Microsoft Flow”)是一种基于事件触发一系列操作的非常简洁的方式,并且内置了大量连接器,让生活变得超级轻松。作为开发人员对我们来说很容易,也就是说,对垃圾邮件发送者来说不太容易,因为这就是我在上述文件夹中提交电子邮件后会发生的事情:
使用我的 Microsoft 365 电子邮件帐户的内置连接器,该文件夹中存在的新电子邮件会触发一个全新的流实例。接下来,我添加了“HTTP”连接器,它使我能够发出出站请求:
这个请求所做的只是向 Password Purgatory 上称为“create-hell”的 API 发送一个 POST。它传递一个 API 密钥,因为我不希望任何人都提出这些请求,因为它会创建将在 Cloudflare 中持久存在的数据。说到这里,我们来看看那边发生了什么。
第 3 步:调用 Cloudflare Worker 并在 KV 中创建记录
让我们从一些历史开始:回到不远的过去,Cloudflare 不是主机,而是将代理请求反向传递到原始服务,并在此过程中与它们一起做一些很酷的事情。这使得向任何网站添加 HTTPS 变得容易(并且免费),添加了大量非常简洁的 WAF 功能,并使我们能够通过缓存做一些很酷的事情。但这都是在传输过程中的酷炫,而应用程序逻辑、数据和大量代码库都位于该原始站点。 Cloudflare Workers开始改变这一点,突然间我们的代码在世界各地的数百个节点上运行,非常好,而且离我们的访问者很近。这是否开始使 Cloudflare 成为“主机”?嗯……但数据本身仍然在原始服务上(暂时缓存除外)。快进到现在,有多种选项可以在 Cloudflare 的边缘存储数据,包括他们的(目前是测试版) R2 服务、 Durable Objects 、(即将推出的) D1 SQL 数据库,以及对这篇博文最重要的Workers KV 。如果您现在可以在他们的环境中构建整个应用程序,这是否会使他们成为主机?也许是这样,但让我们暂时跳过标题并专注于代码。
我要在这里引用的所有代码都是开源的,可以在公共 Password Purgatory Logger Github 存储库中找到。在完成所有工作的 index.js 文件的早期,您会看到一个名为“createHell”的函数,该函数在上述流程步骤运行时被调用。该代码创建一个 GUID,然后将其存储在 KV 中,之后我可以在 Cloudflare 仪表板中轻松查看它:
目前还没有任何值,只有一个键,它通过名为“kvKey”的属性中的 JSON 响应返回。要在流程中读回它,我需要一个“解析 JSON”步骤,其中包含从示例生成的模式:
此时,我现在在持久性存储中拥有了一个唯一 ID,并且它在流中可用,这意味着是时候向垃圾邮件发送者发送电子邮件了。
第 4 步:邀请垃圾邮件发送者下地狱
因为不回复是不礼貌的,我想给垃圾邮件发送者回一封电子邮件,并邀请他们填写我非常特别的注册表单。为此,我抓取了“回复电子邮件”连接器并将 kvKey 提供给超链接:
这是一封 HTML 电子邮件,其密钥隐藏在超链接标签中,因此看起来并不奇怪。使用这个连接器意味着当电子邮件发送时,它看起来就像我自己精心制作的一样:
现在执行了整个流程,我们可以查看每个步骤的历史记录并查看数据在它们之间的移动方式:
现在,我们玩等待游戏?
第 5 步:记录垃圾邮件发送者的痛苦
浪费垃圾邮件发送者的时间本身是好的。让他们尝试通过越来越迟钝的密码复杂性标准来让他们感到痛苦是更好的选择。但最好的事情 –抵抗– 是记录痛苦并公开分享以供我们集体娱乐?
因此,通过点击链接,垃圾邮件发送者最终会出现在此处(欢迎您点击该链接并尝试一下):
kvKey 通过查询字符串传递,页面邀请垃圾邮件发送者开始成为合作伙伴的过程。他们需要留下的只是一个电子邮件地址……和一个密码。然后,该页面嵌入了来自 Password Purgatory 网站的 2 个脚本,您可以在我在原始博客文章中创建的开源和公共 Github 存储库中找到这两个脚本。每次创建帐户的尝试都只会将密码发送到我几个月前创建的原始密码炼狱 API,然后它会以下一组标准进行响应。但是每次尝试也会发送所提供的标准(第一次没有,然后在每次后续的尝试中都会变得越来越奇怪),他们试图用来满足标准的密码和kvKey,因此它们都可以捆绑在一起。这意味着之前创建的 Cloudflare Workers KV 条目逐渐建立如下:
代码中内置了几个小条件:
- 如果在 Cloudflare 上实际不存在的日志请求中传递了 kvKey,则返回 HTTP 404。这是为了确保 randos 不会尝试将垃圾日志提交到 KV。
- 记录第一个密码后,有一个 15 分钟的窗口可以记录任何其他密码。原因有两个:首先,我不想公开分享垃圾邮件发送者的尝试,直到我确信不会再记录密码,以防万一他们添加 PII 或其他不适当的东西。其次,一旦他们知道 kvKey 的值,非垃圾邮件发送者就可以开始提交日志(例如,当我稍后发布它或通过这篇博文分享它时)。
这就是引诱垃圾邮件发送者并记录他们的痛苦所需的一切,现在是真正有趣的一点?
第 6 步:尽情享受垃圾邮件发送者的痛苦
首次记录垃圾邮件发送者的密码尝试时,Cloudflare Worker 会向我发送一封电子邮件,让我知道我有一个新的垃圾邮件发送者上瘾( 此功能使用 MailChannels 仅在今年推出):
昨天收到这封电子邮件真是太令人兴奋了,我发誓这就像在你的线上钓到鱼一样的感觉!该链接是我可以分享的一个链接,可以让全世界看到垃圾邮件发送者的痛苦。这是通过另一个 Cloudflare Workers 路由实现的,该路由简单地提取给定 kvKey 的日志并将其整齐地格式化为 HTML 响应:
啊,满意?我列出了垃圾邮件发送者花费的时间,目的是在未来进一步完善复杂性标准,以尝试让他们“上瘾”更长时间。例如,密码中对美国邮政编码的要求是否有点特定于地理位置?时间会证明一切,我全心全意地欢迎 PRs 在最初的 Password Purgatory API repo中实现这一点。
哦 – 为了确保最大的吸引力和曝光率,有一个格式整齐的 Twitter 卡片,其中包括最后使用的标准和密码,你知道,这些最终打破了垃圾邮件发送者的精神并导致他们放弃:
垃圾邮件发送者在 Password Purgatory 中总共烧毁了 80 秒 ? #PasswordPurgatory https://t.co/VwSCHNZ2AW
— 特洛伊亨特 (@troyhunt) 2022 年 8 月 3 日
概括
显然,我非常乐意与垃圾邮件发送者混在一起,我希望你也这样做。老实说,我从来没有这么兴奋过我的垃圾邮件!但我也非常喜欢将它与 Power Automate 和 Workers KV 放在一起,我认为您可以将这样的应用程序与基于浏览器的配置以及直接在数百个全球分布的边缘中运行的代码和存储相结合,这非常酷世界各地的节点。我希望垃圾邮件发送者欣赏这一切的优雅?