应用程序发送电子邮件以验证用户帐户或重置密码。我相信以下是应该的方式,我要求参考和实现。
如果应用程序必须在电子邮件中发送链接以验证用户的地址,根据我的观点,链接和应用程序对链接的处理应具有以下特征:
http://host/path?nonce
)中包含nonce。根据HTTP RFC on Safe and Idempotent Methods,这应该是正确的。
问题在于此过程涉及一个额外的页面或用户操作(第3项),这被很多人认为是多余的(如果不是无用的)。我在向同行和客户介绍这种方法时遇到了问题,因此我要求更广泛的技术小组提供相关信息。我跳过POST步骤的唯一论点是可能从浏览器预先加载链接。
谢谢你,
Kariem
详细信息
我保留了主要部分,但为了减少对我故意遗漏的细节的过多讨论,我将添加一些假设:
备注
使用OpenID等,普通网络应用程序可以免于实施标准用户帐户管理(密码,电子邮件...),但仍有一些客户想要“他们自己的用户”
奇怪的是,我还没有找到令人满意的问题,也没有在这里回答。到目前为止我发现了什么:
答案 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讨论了这个话题。
如何以安全的方式执行此操作的简短版本:
需要有关帐户的确凿事实
要求用户至少回答三个预定义问题(由您预定义, 不要让用户创建自己的问题)这不是一件小事。喜欢“什么是 你最喜欢的度假胜地“,不是”你最喜欢的颜色是什么“。
可选:将确认代码发送到用户必须输入的预定义电子邮件地址或手机号码(SMS)。
允许用户输入新密码。
答案 2 :(得分:1)
我通常会同意你的意见,并在下面提出一些修改。
是的,您应该假设他们点击验证链接时会对其进行验证。让他们点击页面中的第二个按钮有点多,只需要双重选择样式注册,您计划向注册的人发送垃圾邮件。标准注册/验证方案通常不需要这样做。