密码重置时如何避免referer信息泄露

信息安全 密码 网页浏览器 推荐人
2021-09-07 08:41:31

大多数密码重置系统都涉及通过电子邮件向用户发送一个一次性链接,让他们重置密码。令牌需要在 URL 中,因为大多数电子邮件客户端不允许 HTML 电子邮件执行 POST 请求,并且要求用户重新键入令牌是不可接受的体验。但是,这会使代币面临通过引用标头泄漏的风险。

一种可能的解决方案是避免密码重置页面上的任何外部链接。但是,大多数网站都有一个包含外部链接(Facebook、Twitter 等)的标准模板,不使用该模板会使页面看起来很奇怪——并可能让用户认为它是一个钓鱼网站。

浏览器供应商似乎意识到了这个问题,并且一些浏览器支持元引用标签,可以将其设置为“从不”,因此 URL 永远不会泄露。然而,并不是所有的浏览器都支持这个标签,所以它不是一个完整的解决方案。

那么,如何创建一个没有这种泄漏的密码重置过程呢?

3个回答

我在实践中看到的第一个选项正是您想要避免的。不要在 URL 中包含令牌,但向用户提供说明以将其从电子邮件中复制并粘贴到链接页面上的表单字段

如果这不是可接受的用户体验,我建议将包含令牌的链接改为非交互式插页式广告。该链接会将用户发送到一个资源,该资源将令牌从 URL 中取出,将其存储在其他地方(cookie、会话状态、任何对您有用的东西),然后 30 倍的用户转发到真正的交互式“忘记密码”页面URL 中不再有令牌。与其他几个答案(页面加载时使令牌无效)建议的方法相比,此方法具有额外的优势,因为您可以在一段时间内继续使用相同的令牌,直到提交表单,因此如果用户忘记或关闭页面不小心,他们可以简单地从他们的电子邮件中重新进入该过程,而不必从头开始请求新的忘记密码。

浏览器泄露链接?

这是我的 chrome 设置的屏幕截图:

镀铬设置

您可以看到浏览器可能会:

  • 向其他服务查询链接是否合法
  • 如果链接有错误,请查询另一个服务

我不知道具体细节,但这意味着您还必须担心这些服务会在用户有机会访问该页面之前泄露令牌,或者您的网络服务器配置错误。

密码重置页面

  • 如果您不想链接推荐人信息,请不要包含该链接。
  • 如果您想减轻某些影响,请在; 中包含一个强大的CRSF 令牌<input type="hidden">这样即使链接被破坏,他们仍然需要一个有效的 CRSF 令牌。
    • 为什么不也需要一个cookie?
  • 如果您有任何机会使用 github 来托管您的网站代码,请不要将您的配置(例如SECRET_KEY用于生成令牌的值)放到网上。

既然是一次性链接,那么只需将原来的token作废,在页面上生成一个新的token(使其成为表单中的不可见字段),然后用密码重置表单POST它。

此外,请勿在电子邮件链接中添加任何可能泄露用户身份的额外信息。一个 SHA-256 令牌足以完成密码重置过程。