这是一个漫长的等待,但最终,经过长时间的努力,全新的 Have I Been Pwned 网站现已上线!
去年二月,我第一次向公共仓库提交了更名服务的提交,并 于今年三月正式发布了新品牌。在此期间,我们彻底重建了网站,更改了几乎所有网页的功能,添加了一大堆新功能,今天,我们甚至还推出了一个周边商店😎
让我向您介绍一些亮点,系好安全带!
搜索
HIBP 的标志性功能是首页上的大搜索框,现在,它变得更好了——它有五彩纸屑!
嗯,并非每个人都能看到,大约只有一半的用户会看到庆祝的回复。这个回复故意设计得欢快是有原因的,让我解释一下:
我和夏洛特在世界各地旅行,与众多使用该服务的用户相处,一个主题反复出现:HIBP 有点儿好玩。它不是一个到处都是连帽衫、挂锁图标,以及散布“暗网”恐慌的恐怖场所。相反,我们的目标是更容易被大众接受,提供真实、可操作的信息,而不是夸张的说辞。五彩纸屑枪(是的,有好几个,而且是动画的)能稍微活跃一下气氛。否则,你得到的可能是红色的回应:
我们曾短暂地考虑过在这个页面上采用更轻松的表达方式,但不知何故,略带悲伤的长号风格似乎不太合适,所以我们最终选择了更为端庄的表达方式。现在,它被放在了一条时间线上,您可以按时间倒序滚动浏览,每条违规事件都概括了事件的经过。如果您想了解更多信息,我们还有一个全新的页面,稍后我会详细介绍。
首先,还有一件事——我们已从网站上移除了用户名和电话号码搜索支持。用户名搜索功能是在 2014 年Snapchat 事件中引入的,电话号码搜索功能是在 2021 年Facebook 事件中引入的。就是这样。这是我们唯一一次加载这些类别的数据,原因有很多。首先,与电子邮件地址相比,从泄露事件中解析出它们都很困难,我们只需使用正则表达式即可提取电子邮件地址(我们已经开源了执行此操作的代码)。用户名是一个字符串。电话号码,嗯,这要视情况而定。它们不仅仅是数字,因为如果你正确地将它们国际化(就像在 Facebook 事件中那样),它们前面还会有一个加号,但它们的格式经常混乱。我们无法发送通知,因为没有人“拥有”用户名,而且与发送电子邮件相比,向电话号码发送短信的成本非常高。此外,除了这两起事件外,HIBP 中其他所有事件都涉及电子邮件地址,因此如果我们问“我被攻破了吗?”,我们总是可以回答这个问题,而无需加载这两个难以解析的字段,而且这些字段通常在大多数数据泄露事件中并不存在。当旧网站提出在搜索框中接受它们时,它造成了混乱和支持开销:“为什么我的号码没有出现在[不管是什么]数据泄露事件中?!”。这就是为什么它从网站上消失了,但我们仍在 API 上支持它,以确保我们不会破坏任何东西……只是不要指望在那里看到更多数据。
违规页面
我们创建这个新页面的原因有很多,其中一个重要原因是首页上的搜索结果过于繁杂,我们想把详细信息推送到其他地方。因此,现在我们为每起违规事件都设置了一个专门的页面,例如:
这些基本上都是我们已经掌握的信息(尽管以更加用户友好的方式显示),但新页面的独特之处在于提供了关于违规后该做什么的更有针对性的建议:
我最近写了关于这部分的文章,以及我们计划如何寻找其他能够为遭遇数据泄露的用户提供适当服务的合作伙伴。例如,身份保护提供商对于许多数据泄露事件来说都至关重要。
既然我们已经上线,我们还将努力完善此页面,添加更多与数据泄露和用户相关的数据。例如,如果服务支持双重身份验证 (2FA),我们会明确指出,而不是依赖上面的通用建议。密钥也一样,我们会为此添加一个部分。最近我们在英国时与 NCSC 进行了一次讨论,讨论如何添加本地化的数据泄露指南,例如,向英国用户展示 NCSC 的徽标以及他们关于该主题的资源链接(建议查看 HIBP 🙂)。
我相信我们还可以做更多的事情,所以如果您有任何好主意,请在下面给我留言。
仪表板
多年来,我们引入了越来越多的功能,这些功能需要我们知道您的身份(或者至少知道您有权访问您正在使用的电子邮件地址)。这始于 2015 年 Ashley Madison 事件期间引入的敏感数据泄露概念,这意味着唯一能查明您是否参与该事件的方法就是在搜索之前收到发送到该地址的邮件。(旁注:我们有很多充分的理由不对所有数据泄露事件都这样做。)2019 年,为了应对滥用问题,我在 API 周围添加了一个身份验证层(它做得非常出色! ),要求在购买密钥之前先进行邮箱验证。随后,更多功能陆续推出:专用域名搜索仪表盘、管理您的付费订阅,以及今年早些时候新增的查看邮箱地址窃取日志的功能。
现在,我们已将所有这些不同的地方统一到一个中央仪表板:
只需扫一眼左侧的导航栏,您就能看到许多熟悉且一目了然的功能。这些功能将大众常用的功能和商务人士常用的功能融为一体。现在,所有功能都集中在一个“登录”按钮之后,该按钮会在显示之前验证电子邮件地址的访问权限。未来,我们还将添加密钥支持,避免用户需要先发送电子邮件。
仪表板方法不仅仅是将现有功能整合到同一个平台下;它还将为我们提供一个平台,以便未来构建需要先验证电子邮件地址的新功能。例如,我们经常被要求为用户提供订阅家人电子邮件地址通知的功能,但通知会发送到不同的地址。我们中的许多人都为他人提供技术支持,因此将这项功能放在已验证电子邮件地址的位置将非常实用。所以,敬请期待这项功能以及其他众多功能。
域名搜索功能
这一项功能投入的时间比其他大多数功能加起来还要多。我们在这方面做了很多尝试,首先是打造一个更加简洁的已验证域名列表:
搜索结果现在提供了更清晰的摘要,并添加了按电子邮件地址和热门请求的新功能进行过滤的功能 – 只是最新的违规行为(它在下拉菜单中):
现在,所有这些搜索都只需从 API 返回 JSON 数据,整个仪表板就像一个单页应用,因此一切都非常流畅。上述过滤操作完全是在客户端根据域名搜索的完整 JSON 数据进行的,我们已经对超过 25 万个被泄露电子邮件地址的域名进行了测试,这种方法仍然有效(尽管可以说,您真正想要的是通过 API 获取这些数据,而不是在浏览器窗口中滚动浏览)。
域名所有权验证也已完全重写,界面更加简洁:
我们仍需改进非邮箱验证方式,使其更加顺畅,但之前也做到了,所以至少我们目前还没有出现问题。我们很快就会改进,保证!
API
首先:API 本身没有任何变化。本次更新不会破坏任何功能!
在 UX rebuild GitHub 仓库中,有一个关于如何正确编写 API 文档的讨论。普遍的共识是使用 OpenAPI,我们开始使用Scalar来实现这一点。事实上,你甚至可以在haveibeenpwned.com/scalar上看到 Stefan 在这方面所做的工作:
它非常酷,尤其是它用各种不同的语言记录示例的方式,甚至还有一个测试运行器,实际上是浏览器中的 Postman。很酷,但我们就是没能及时完成。因此,我们暂时保留了旧文档,只是对其进行了样式调整,使其看起来与网站的其他部分一样(我认为它仍然相当流畅),但我们确实打算在不需要进行如此大规模的发布时转向 Scalar 实现。
商品商店
你知道还有什么超棒的吗?周边商品!不,说真的,这些年来我们收到了很多想要 HIBP 品牌周边商品的请求,现在,我们终于拿到了:
我们现在在merch.haveibeenpwned.com上开了一家实体周边商店!考虑到为了让所有新东西都能用上,我们不得不动用了那么多机械零件,这大概是我们最浪费时间的地方了。不过,对夏洛特来说,这算是个充满热情的项目,所以,没错,现在你真的可以买到 HIBP 周边了。这一切都是通过 Teespring(我以前在哪里听过这个名字?! )完成的,上面列出的所有商品都是成本价——我们完全不赚钱,这只是一个为社区做的有趣的活动 🙂
我们也尝试过他们的贴纸选项,但效果远不及我们在 Sticker Mule 上已有的单品商店,所以目前来说,这仍然是笔记本电脑装饰的首选。或者,你也可以直接去下载开源的艺术作品,然后随时随地打印出来。
书呆子小贴士
我们仍然在 Microsoft Azure 上运行源站服务,结合使用网站应用服务、大多数 API 的“无服务器”函数(其中仍有一些异步函数,它们被称为基于浏览器的功能的一部分)、SQL Azure“超大规模”以及队列、blob 和表等存储帐户功能。几乎所有代码都是 C# 编写的,并结合 .NET 9.0 和 .NET Core 上的 ASP.NET MVC 编写。Cloudflare 仍然发挥着重要作用,在工作器中贡献了大量代码,R2 存储中的数据以及他们在 WAF 和缓存方面的所有优秀功能。我们现在也完全使用他们的 Turnstile 服务进行反自动化,并且完全放弃了谷歌的 reCAPTCHA——太棒了!
前端现在是最新一代的 Bootstrap,我们所有 CSS 都使用 SASS,所有 JavaScript 都使用 TypeScript。我们在冰岛的(另一位) Ingiber刚刚出色地完成了界面设计工作,大大超出了我们的预期。现在的结果远远超出了我们开始这个过程时的预期,这很大程度上要归功于 Ingiber 能够将简单的需求转化为精美的成果😍 我很高兴上个月 Charlotte、Stefan 和我有机会在雷克雅未克和他一起度过了一段美好的时光,还一起喝了几杯啤酒。
我们还对网站性能进行了一些可衡量的改进。例如,在旧网站下线之前,我运行了Pingdom 网站速度测试:
然后将其运行到新的版本上:
因此,我们减少了 28% 的页面大小和 31% 的请求。加载时间差异很大(而且变化很大),但右侧列中所有值都有了可靠的衡量指标,这已经是一个令人欣慰的结果。想想多年来任何一位 Web 开发人员都会听到的评论,说网页体积变大了多少,而 11 年后,我们却实现了两位数的百分比的稳定缩减!
最后,任何可能被解读为追踪或广告膨胀的东西都不存在,因为我们根本不做这些 🙂 事实上,我们唯一真正的流量统计数据是基于 Cloudflare 在流量流经其边缘节点时所观察到的数据。而 1Password 的产品植入,一如既往,只是文字和图片。我们甚至不追踪出站点击,如果他们想在我们链接到的落地页上捕捉到这些信息,那是他们的事。这实际上使得我们与那些想要产品植入的身份盗窃公司进行的讨论变得更加困难,因为他们习惯于获取侵入式追踪所产生的各种数据,但我们不会以任何其他方式获得这些信息。
人工智能
我想在这里简单提一下,因为人工智能似乎总是被夸大或贬低。它要么能解决世界问题,要么只会制造“垃圾”。在这次重建过程中,我特别大量地使用了 Chat GPT,尤其是在最后几天时间紧迫、大脑疲惫不堪的时候。以下是一些它发挥巨大作用的例子:
I'm using Bootstrap icons from here: https://icons.getbootstrap.com/ What's a good icon to illustrate a heading called "Index"?
就在最后一刻,我们意识到没有时间正确实现 Scalar,我需要快速将所有现有的 API 文档迁移到新模板。该页面上有超过 2,000 个图标,这种方法意味着每次都要花大约 30 秒才能找到正确的图标。
我们删除了旧网站上的一些页面,但在将其迁移之前,我想确切地知道那里有什么:
Write me a PowerShell script to crawl haveibeenpwned.com and write out each unique URL it finds
进而:
Now write a script to take all the paths it found and see if they exist on stage.haveibeenpwned.com
它也发现了一些好东西,比如我忘记迁移的 security.txt 文件。它也发现了一些从未存在过的东西,所以这是常见的“信任,但要验证”的情况。
还有无数的小事,每当我需要任何东西,从 CSS 建议到配置 Cloudflare 规则,再到 .NET Core Web 应用中的一些特性,正确答案都能在几秒钟内得到。我想说它 90% 的时间都是正确的,如果你现在没有在软件开发工作中积极使用人工智能(我相信肯定还有更好的方法),我可以很肯定地说“你做错了”。
这里的旅程
很难解释我们为此付出了多少努力,这远远超出了您今天在网站上看到的内容。这些看似微不足道的小事,例如对使用条款和隐私政策的细微修改,却花费了我们大量的时间和数千美元与律师沟通(这些只是我们处理数据方式的细微更新,以及诸如窃取日志之类的新服务的体现)。
我们在周日凌晨推出了新网站,几乎一切进展顺利:
我们修复了一两个小问题,并迅速推送了上线,仅此而已。实际上,我一直等到上线两天后才发布这篇文章,就是为了先尽可能多地解决问题。从那时起,我们已经发布了十几个新版本,只是为了保持快速迭代和改进。说实话,这项工作有点紧张,而且非常耗时,占据了我们的大部分精力,尤其是在上线前的几周。为了强调这一点,我周一早上就收到了一条健康警报:
没有什么比经验数据更能说明问题了!上线的那个周末尤其残酷;我觉得我已经几十年没为一个软件发布投入过这么长时间了。
Have I Been Pwned 已经成为我人生四分之一的热情所在。我 2013 年创立的这个网站,从来没想过能让我走到今天,持续这么久,说实话,它真的做到了,我有点震惊。我觉得,我们打造的这个新网站和新品牌,已经把这个小小的宠物项目提升成了一项严肃的服务,并且专业性达到了一个新的高度。但我希望,读到这里,你会看到它保留了这项服务一直以来的所有优点,我很高兴今天还能在这里用这个标签写第 205 篇博文。感谢阅读,现在就去享受新网站吧😊
原文: https://www.troyhunt.com/have-i-been-pwned-2-0-is-now-live/