在使用nonce的电子邮件中激活/注册/密码重置链接的最佳做法是什么

时间:2009-06-30 23:28:49

标签: security http authentication idempotent

应用程序发送电子邮件以验证用户帐户或重置密码。我相信以下是应该的方式,我要求参考和实现。

如果应用程序必须在电子邮件中发送链接以验证用户的地址,根据我的观点,链接和应用程序对链接的处理应具有以下特征:

  1. 该链接在请求URI(http://host/path?nonce)中包含nonce
  2. 在关注链接(GET)后,会向用户显示一个表单,可选择使用nonce。
  3. 用户确认输入(POST)。
  4. 服务器接收请求并且
    • 检查输入参数,
    • 执行更改,
    • 并使nonce无效。
  5. 根据HTTP RFC on Safe and Idempotent Methods,这应该是正确的。

    问题在于此过程涉及一个额外的页面或用户操作(第3项),这被很多人认为是多余的(如果不是无用的)。我在向同行和客户介绍这种方法时遇到了问题,因此我要求更广泛的技术小组提供相关信息。我跳过POST步骤的唯一论点是可能从浏览器预先加载链接。

    • 是否有关于这个主题的参考资料可以更好地解释这个想法并说服一个非技术人员(来自期刊,博客......的最佳实践)?
    • 是否有实施此方法的参考站点(最好是受欢迎且有很多用户)?
      • 如果没有,是否有记录原因或等效替代方案?

    谢谢你,
    Kariem


    详细信息

    我保留了主要部分,但为了减少对我故意遗漏的细节的过多讨论,我将添加一些假设:

    • 电子邮件的内容不是此讨论的一部分。用户知道她必须单击链接才能执行操作。如果用户没有反应,则不会发生任何事情,这也是已知的。
    • 我们不必说明我们邮寄用户的原因,也不必说明通信政策。我们假设用户希望收到电子邮件。
    • nonce具有到期时间戳,并且与收件人电子邮件地址直接关联,以减少重复项。

    备注

    使用OpenID等,普通网络应用程序可以免于实施标准用户帐户管理(密码,电子邮件...),但仍有一些客户想要“他们自己的用户

    奇怪的是,我还没有找到令人满意的问题,也没有在这里回答。到目前为止我发现了什么:

3 个答案:

答案 0 :(得分:24)

这个问题与Implementing secure, unique “single-use” activation URLs in ASP.NET (C#)非常相似。

我的回答很接近你的计划,指出了一些问题 - 例如短期有效期,处理双重注册等。
您对加密随机数的使用也很重要,许多人倾向于跳过 - 例如“我们只需使用GUID”......

你提出的一个新观点,这在这里很重要,是GET的幂等性。
虽然我同意你的一般意图,但很明显,幂等性与一次性联系直接矛盾,这在某些情况下是必要的。

我本想假设这并没有真正违反GET的幂等性,但不幸的是它确实...另一方面,RFC说GET 应该是幂等的,它的不是必须的。所以我会说在这种情况下放弃它,并坚持使用一次性自动失效的链接。

如果真的想要达到严格的RFC合规性,而不是进入非幂等(?)GET,那么你可以让GET页面自动提交POST - 这是一个漏洞RFC的那一点,但是合法的,你不需要用户双重选择,而且你不是在唠叨他......

你真的不必担心预加载(你是在谈论CSRF,还是浏览器优化器?)... CSRF因为nonce而无用,而优化器通常不会处理javascript(用于自动提交)预装页面。

答案 1 :(得分:9)

关于密码重置:

通过向用户的注册电子邮件地址发送电子邮件来实现此目的的做法虽然在实践中很常见,但并不是很好的安全性。这样做会将您的应用程序安全性完全外包给用户的电子邮件提供商。无论您需要多长时间的密码以及您使用的任何聪明的密码哈希都无关紧要。我可以通过阅读发送给用户的电子邮件进入您的网站,因为我可以访问电子邮件帐户,或者能够在去往用户的任何地方读取未加密的电子邮件(想想:邪恶的系统管理员)。

根据相关网站的安全要求,这可能会也可能不重要,但作为网站用户,我至少希望能够禁用此类密码重置功能,因为我认为它不安全

我发现this white paper讨论了这个话题。

如何以安全的方式执行此操作的简短版本:

  1. 需要有关帐户的确凿事实

    1. 用户名。
    2. 电子邮件地址。
    3. 10位数帐号或其他信息 像社会安全号码。
  2. 要求用户至少回答三个预定义问题(由您预定义, 不要让用户创建自己的问题)这不是一件小事。喜欢“什么是 你最喜欢的度假胜地“,不是”你最喜欢的颜色是什么“。

  3. 可选:将确认代码发送到用户必须输入的预定义电子邮件地址或手机号码(SMS)。

  4. 允许用户输入新密码。

答案 2 :(得分:1)

我通常会同意你的意见,并在下面提出一些修改。

  1. 用户在您的网站上注册,提供电子邮件。
  2. 验证电子邮件通过两个链接发送到用户帐户: a)与GUID的一个链接以验证注册b)与GUID的一个链接以拒绝验证
  3. 当他们从他们的电子邮件中访问验证网址时,系统会自动对其进行验证,并在您的系统中对验证指示进行标记。
  4. 当他们从他们的电子邮件中访问拒绝网址时,他们会自动从可能的验证队列中删除,但更重要的是,您可以告诉用户您对电子邮件注册感到抱歉,并为他们提供更多选项,例如从您的电子邮件中删除他们的电子邮件系统。这将停止任何有关某人在您的系统中输入我的电子邮件的自定义服务类型投诉...等等等等等等。
  5. 是的,您应该假设他们点击验证链接时会对其进行验证。让他们点击页面中的第二个按钮有点多,只需要双重选择样式注册,您计划向注册的人发送垃圾邮件。标准注册/验证方案通常不需要这样做。

相关问题