Have I Been Pwned 2.0 现已上线!
Sponsored by:
Have I Been Pwned 2.0 is Now Live!
2025年5月20日
经过漫长的等待,全新的 Have I Been Pwned 网站终于上线了!
我去年二月就对这个重新命名的服务公开仓库进行了第一次 commit,并且在今年三月软启动了新品牌。在此期间,我们完全重建了网站,更改了几乎每个网页的功能,添加了大量新功能,而且今天,我们甚至还推出了周边商店 😎
让我来和你聊聊其中的一些亮点,请做好准备!
搜索功能
HIBP 的标志性功能是首页上那个大大的搜索框,现在它更棒了——它有彩带了!
当然,不是每个人都能看到庆祝的回应,只有大约一半的用户会看到。这种回应故意设计得比较轻松愉快是有原因的,让我解释一下:
我和 Charlotte 在世界各地与许多不同的用户交流时,反复出现一个主题:HIBP 有点俏皮。它不是一个充斥着连帽衫、挂锁图标和对“暗网”的恐吓的恐怖场所。相反,我们的目标是让大众更容易接受,并提供基于事实、可操作的信息,而不是夸张的宣传。彩带枪(是的,有好几支,而且都是动画的)能活跃一下气氛。另一种情况是你得到红色的回应:
我们曾短暂地考虑过也对这个页面进行更轻松的处理,但不知为何,悲伤的音调似乎不太合适,所以我们选择了一个更端庄的回应。现在,它显示为一个你可以按时间倒序滚动的timeline,每个 breach 都概述了发生的事情。如果你想了解更多信息,我们还有一个全新的页面,稍后我会详细介绍。
首先,有一点小变化——我们已经从网站上移除了用户名和电话号码搜索支持。用户名搜索是在 2014 年为 the Snapchat incident 推出的,电话号码搜索是在 2021 年为 the Facebook incident 推出的。仅此而已。这是我们唯一一次加载这些类型的数据,而且有几个很好的理由这样做。首先,与电子邮件地址相比,从 breach 中解析出它们非常痛苦,我们只需使用正则表达式来提取电子邮件地址 (we've open sourced the code that does this)。用户名是一个字符串。电话号码,嗯,这取决于情况。它们不仅仅是数字,因为如果你对它们进行正确的国际化(就像它们在 Facebook incident 中一样),它们前面也会有一个加号,但它们的格式经常到处都是。而且我们无法发送通知,因为没有人“拥有”一个用户名,而且与发送电子邮件相比,发送短信非常昂贵。此外,HIBP 中的每个其他 incident(除了这两个)都有电子邮件地址,所以如果我们问“我是否被 pwned 了?”,我们总是可以在不加载这两个难以解析的字段的情况下回答这个问题,而且它们通常也不存在于大多数 breach 中。当旧网站提供在搜索框中接受它们时,它造成了混乱和支持负担:“为什么我的号码不在 [whatever] breach 中?!”。这就是为什么它 从网站上 消失了,但我们保留了对 API 的支持,以确保我们不会破坏任何东西……只是不要期望在那里看到更多数据。
Breach 页面
我们创建这个新页面有很多原因,尤其是因为首页上的搜索结果变得太拥挤了,我们想把细节转移到其他地方。所以,现在我们为每个 breach 都有一个专门的页面,例如:
这在很大程度上是我们已经掌握的信息(尽管以一种更加用户友好的方式显示),但新页面独特之处在于关于 breach 之后 该怎么做的更有针对性的建议:
I recently wrote about this section 以及我们计划如何识别其他能够为发现自己身处 breach 中的人们提供适当服务的合作伙伴。例如,身份保护提供商对许多数据 breach 来说都很有意义。
现在我们已经上线了,我们还将致力于用更多 breach 和用户特定的数据来充实这个页面。例如,如果该服务支持 2FA,那么我们将专门调用它,而不是依赖上面的通用建议。passkeys 也是如此,我们将为此添加一个部分。最近我们在英国与 NCSC 讨论时,讨论了添加本地化的数据 breach 指导,例如,向来自英国的人们展示 NCSC 标志和指向 他们的资源 的链接(它建议检查 HIBP 🙂)。
我确信我们可以在这里做更多的事情,所以如果你有什么好主意,请在下面给我留言。
仪表盘
多年来,我们引入了越来越多的功能,这些功能要求我们知道你是谁(或者至少你有权访问你正在使用的电子邮件地址)。它始于 introducing the concept of a sensitive breach 在 2015 年 Ashley Madison saga 期间,这意味着查看你参与该 incident 的唯一方法是在搜索之前收到一封发送到该地址的电子邮件。(旁注:There are many good reasons why we don't do that on every breach。) 在 2019 年,当 I put an auth layer around the API to tackle abuse (它做得 非常棒!)我要求先进行电子邮件验证,然后才能购买密钥。还有更多的事情随之而来:一个专用的域名搜索仪表盘,管理你的付费订阅,以及今年早些时候,查看你的电子邮件地址的 stealer 日志。
我们现在将所有这些不同的地方统一到一个中央仪表盘中:
从左侧的导航栏一瞥,你可以看到很多熟悉的、不言自明的特征。这些结合了与大众和那些更面向商业的人相关的东西。它们现在都在一个“Sign In”后面,该登录会在显示之前验证对电子邮件地址的访问权限。将来,我们还将添加 passkey 支持,以避免首先发送电子邮件。
仪表盘方法不仅仅是将现有功能移动到一个横幅下;它还将为我们提供一个平台,以便将来构建需要首先进行电子邮件地址验证的新功能。例如,我们经常被要求向人们提供将其家人的电子邮件地址订阅到通知的能力,但让它们发送到不同的地址。我们中的许多人为其他人提供技术支持,这将是一个真正有用的功能,在您已经验证了您的电子邮件地址的点上进行放置是有意义的。所以,请继续关注,还有很多其他功能。
域名搜索功能
在这个功能上花费的时间比大多数其他功能加起来还要多。我们在这里尝试了很多事情,首先是一个更简洁的已验证域名列表:
搜索结果现在给出了一个更简洁的摘要,并添加了按电子邮件地址和被强烈要求的新功能——仅限最新 breach 的过滤(它在下拉菜单中):
所有这些搜索现在只从 API 返回 JSON,整个仪表盘充当单页面应用程序,所以一切都 非常 快捷。上面的过滤纯粹是在客户端针对域名搜索的完整 JSON 完成的,我们已经对超过 25 万个 breach 电子邮件地址的域名进行了测试,并且仍然可行(虽然可以说,你真的想通过 API 获取该数据,而不是在浏览器窗口中滚动浏览它)。
域名所有权验证也已完全重写,并具有更简洁、更简单的界面:
我们仍然需要做一些工作来使非电子邮件验证方法更顺畅,但这以前也是这种情况,所以至少我们没有倒退。这很快就会发生,保证!
API
首先:API 本身没有任何变化。此更新不会破坏任何内容!
在 UX 重建 GitHub 仓库中有一个关于 the right way to do API documentation 的讨论。普遍的共识是 OpenAPI,我们开始使用 Scalar 沿着这条路线走下去。事实上,你甚至可以在 haveibeenpwned.com/scalar 看到 Stefan 在这方面所做的工作:
它非常酷,尤其是它以各种不同的语言记录示例的方式,甚至还有一个测试运行器,它实际上是浏览器中的 Postman。很酷,但我们就是无法及时完成它。因此,我们暂时保留了 the old documentation 并且只是对其进行了样式设置,使其看起来像网站的其余部分(我认为它仍然非常流畅),但当我们没有受到如此大规模发布的压力时,我们确实打算推出 Scalar 实现。
周边商店
你知道还有什么很棒吗?周边!不,说真的,多年来我们收到了 很多 关于 HIBP 品牌周边的请求,现在,我们来了:
我们实际上现在在 merch.haveibeenpwned.com 有一家真实的周边商店了!考虑到我们必须做多少机械工作才能使所有新东西正常工作,这可能是对我们时间最糟糕的利用,但这是 Charlotte 的一个有点热情项目,所以是的,现在你实际上可以购买 HIBP 周边了。这一切都是通过 Teespring 完成的 (where have I heard that name before?!) 并且那里列出的所有东西都是按成本价出售的——我们绝对没有赚钱,这只是社区的一项有趣的举措 🙂
我们确实尝试了他们用于贴纸的选项,但它们远远低于我们已经拥有的 our little one-item store on Sticker Mule,所以目前,这仍然是笔记本电脑装饰的首选。或者只是去获取 the open source artwork 并从你喜欢的任何地方获得你自己的印刷品。
Nerdy Bits
我们仍然在 Microsoft Azure 上运行原始服务,它结合了用于网站的 App Service、“无服务器”功能(serverless Functions)用于大多数 API(仍然有一些异步的API被作为基于浏览器的功能的一部分调用)、SQL Azure "Hyperscale" 和存储帐户功能(例如队列、blobs 和 tables)。几乎所有的编码都是 C#,带有 .NET 9.0 和 ASP.NET MVC on .NET Core 用于 Web 应用程序。Cloudflare 仍然扮演着 重要 角色,在 workers 中有很多代码,在 R2 存储中有很多数据,以及围绕 WAF 和缓存的所有好处。我们现在也专门使用他们的 Turnstile 服务进行反自动化,并且完全放弃了 Google 的 reCAPTCHA——太棒了!
前端现在是最新的 Bootstrap,我们使用 SASS 处理所有 CSS,使用 TypeScript 处理所有 JavaScript。我们在冰岛的(另一位)伙伴 Ingiber 在界面方面做得非常出色,并且大大超出了我们的所有预期。我们现在所拥有的远远超出了我们在这个过程开始时的预期,这很大程度上归功于 Ingiber 将简单的要求转化为美妙事物的能力😍 我很高兴 Charlotte、Stefan 和我上个月在雷克雅未克与他共度时光并分享了一些啤酒。
我们还在网站性能方面做出了一些可衡量的改进。例如,我在关闭旧网站之前运行了一个 Pingdom website speed test:
然后在新网站上运行它:
因此,我们减少了 28% 的页面大小和 31% 的请求。加载时间几乎相同(而且变化很大),但是对于右侧列中的所有值都有可靠的度量标准是一个非常令人满意的结果。此外,请考虑多年来网络开发中的任何人都看到的关于网页变得越来越大的评论,而 11 年后,我们在这里削减了可靠的两位数百分比!
最后,任何可能被解释为跟踪或广告膨胀的东西根本不存在,因为我们根本不这样做🙂 事实上,我们拥有的唯一真正的流量统计数据是基于 Cloudflare 在流量流经其边缘节点时看到的数据。而且 1Password 产品展示和以往一样,只是文本和图像。我们甚至不跟踪出站点击,如果他们想在我们链接到的登陆页面上捕获它,这取决于他们。这实际上使得与希望进行产品展示的身份盗窃公司进行的讨论更加困难,因为他们习惯于获得侵入性跟踪产生的数字类型,但我们不会以任何其他方式进行。
AI
我想在这里快速说明这一点,因为 AI 似乎总是被过度吹嘘或贬低。要么它将解决世界的问题,要么它只是产生“垃圾”。我在此重建期间,尤其是在时间变得紧张并且我的大脑变得疲惫的最后几天,特别广泛地使用了 Chat GPT。以下是一些它发挥了重要作用的示例:
我正在使用来自这里的 Bootstrap 图标:https://icons.getbootstrap.com/
什么图标最适合说明标题为“索引”?
这恰好是在我们意识到我们没有时间正确实施 Scalar 的最后一刻,我需要快速将所有现有的 API 文档迁移到新模板。该页面上有 2,000 多个图标,这种方法意味着每次大约需要 30 秒才能找到合适的图标。
我们关闭了旧站点上的一些页面,但在推出它之前,我想确切地知道那里有什么:
编写一个 PowerShell 脚本来抓取 haveibeenpwned.com 并写出它找到的每个唯一 URL
然后:
现在编写一个脚本来获取它找到的所有路径,并查看它们是否存在于 stage.haveibeenpwned.com 上
它也发现了一些好东西,比如我忘记迁移的 security.txt 文件。它还发现了一些从未存在的东西,所以这是通常的“信任,但验证”的情况。
还有无数的小事,每次我需要从一些 CSS 建议到配置 Cloudflare 规则到 .NET Core Web 应用程序的特性,正确的答案都在几秒钟之内。我会说它有 90% 的时间是正确的,而且如果你现在没有在你的软件开发工作中积极使用 AI(而且我相信有更好的方法),我很自信地说“你做错了”。
The Journey Here
很难解释有多少投入到其中,而且这远远超出了你今天在网站上看到的内容。这似乎是小事,比如对使用条款和隐私政策的细微修订,这需要花费数小时的时间和数千美元的律师费(只是对我们处理数据方式的微小更新以及对新服务(例如 stealer 日志)的反映)。
我们在我当地时间的周日凌晨推出了新站点,并且 几乎 一切顺利:
一两个我们已经修复并快速推送的小故障,仅此而已。事实上,我一直等到现在,上线两天后,才发布这篇文章,以便我们可以尽可能多地解决问题。自那时以来,我们已经推送了十几个新版本,只是为了保持快速迭代和改进。说实话,这有点紧张,而且一直是一项 非常 耗费时间的努力,它占据了我们的注意力,尤其是在发布前的最后几周。只是为了强调这一点,我实际上在周一早上第一件事就收到了健康警报:
没有什么比经验数据更能说明问题的了!我们上线的最后一个周末尤其残酷;我不认为我已经花了那么多高强度的时间在软件版本上几十年了。
Have I Been Pwned 已经成为我四分之一人生的热情所在。我在 2013 年构建的东西从未打算带我走这么远或持续这么长时间,而且如果我说实话,我很震惊它做到了。我觉得我们用这个新网站和新品牌构建的东西已经将这个小宠物项目提升到具有新专业水平的严肃服务。但我希望在阅读本文时,你会看到它保留了这项服务一直以来都很棒的一切,而且我很高兴今天仍然在这里写关于它的 the 205th blog post with that tag。感谢你的阅读,now go and enjoy the new website 😊
Have I Been Pwned Tweet Post Update Email RSS Troy Hunt's Picture
Troy Hunt
Hi, I'm Troy Hunt, I write this blog, create courses for Pluralsight and am a Microsoft Regional Director and MVP who travels the world speaking at events and training technology professionals
Troy Hunt
Hi, I'm Troy Hunt, I write this blog, run "Have I Been Pwned" and am a Microsoft Regional Director and MVP who travels the world speaking at events and training technology professionals
Upcoming Events
I often run private workshops around these, here's upcoming events I'll be at:
Must Read
- Data breach disclosure 101: How to succeed after you've failed
- Data from connected CloudPets teddy bears leaked and ransomed, exposing kids' voice messages
- Here's how I verify data breaches
- When a nation is hacked: Understanding the ginormous Philippines data breach
- How I optimised my life to make my job redundant
Don't have Pluralsight already? How about a 10 day free trial? That'll get you access to thousands of courses amongst which are dozens of my own including:
- OWASP Top 10 Web Application Security Risks for ASP.NET
- What Every Developer Must Know About HTTPS
- Hack Yourself First: How to go on the Cyber-Offense
- The Information Security Big Picture
- Ethical Hacking: Social Engineering
- Modernizing Your Websites with Azure Platform as a Service
- Introduction to Browser Security Headers
- Ethical Hacking: SQL Injection
- Web Security and the OWASP Top 10: The Big Picture
- Ethical Hacking: Hacking Web Applications
This is already the newest post! #### Weekly Update 452 Subscribe
Subscribe Now!
Send new blog posts: daily weekly Hey, just quickly confirm you're not a robot: Submitting... Got it! Check your email, click the confirmation link I just sent you and we're done.
Copyright 2025, Troy Hunt
This work is licensed under a Creative Commons Attribution 4.0 International License. In other words, share generously but provide attribution.
Disclaimer
Opinions expressed here are my own and may not reflect those of others. Unless I'm quoting someone, they're just my own views.
Published with Ghost
This site runs entirely on Ghost and is made possible thanks to their kind support. Read more about why I chose to use Ghost.