我在我的Rails 3.0应用程序上使用Devise,我们目前已启用确认和可恢复。这些模块要求用户确认其电子邮件帐户(可确认),并允许用户通过将电子邮件发送到其电子邮件帐户(可恢复)来重置密码。
不幸的是,我们很难“设计”(双关语)一个合理的安全政策,允许用户在不确认其帐户的情况下使用该网站。我们对安全性强制执行以下要求:
确认您的帐户需要登录或登录。如果不是这种情况,并且用户A意外输入了恶意用户B的错误电子邮件地址,B将收到确认电子邮件链接,自动登录,并且从那里可以通过“电子邮件重置密码链接”重置密码。要求B使用A的凭证登录可以消除这种可能性。
通过电子邮件重置密码需要确认电子邮件。这是因为如果用户A意外输入了错误的电子邮件地址(属于恶意用户B的电子邮件地址),则B将收到确认电子邮件链接并知道A已注册帐户。因此B可以访问该站点并使用重置密码功能来更改帐户上的密码,然后可以确认他的帐户。要求确认的电子邮件地址可以消除这种可能性。
一切都很好。除非用户A创建帐户,但尚未确认其帐户,然后返回该网站并忘记密码。这里A被发现在循环依赖循环中,重置密码需要确认他的帐户,但确认他的帐户需要使用他忘记的密码登录。
两种可能的解决方案:
要求用户在登录后立即确认其帐户。这会产生更多的注册摩擦,但会消除循环依赖性。
允许用户在没有确认帐户的情况下重置密码,但不允许用户在确认帐户之前输入任何敏感信息或执行重要操作。这样,恶意用户B仍然可以劫持帐户,但他将获得对帐户的控制权,而无需任何有价值的信息或权力。
那里有更好的解决方案吗?公司如何处理这个问题?我已经使用了几个不需要立即确认电子邮件的网站,所以如果我们能够以不需要像#2那样复杂的方式实现这一点,那就太好了。
谢谢!
答案 0 :(得分:0)
创建一种角色,其中用户经过身份验证但未经确认。在进行任何帐户更改(例如重置密码或电子邮件地址)之前要求用户确认其帐户并非没有道理。
我认为这里的诀窍就是你可以让用户在没有登录的情况下确认帐户。如果用户A输入了错误的电子邮件地址,那么你期望做什么?尽力帮助他们在开始时输入正确的电子邮件地址。这对用户来说是一个相当不可原谅的罪 - 他们应该知道如何输入他们的电子邮件地址。如果他们无法收到电子邮件,并使用了错误的帐户,那么最后的办法是为您提供一些技术支持和/或给他们一些安全问题以帮助他们恢复帐户。
点击电子邮件中的“确认”链接后,系统会要求他们登录。简单就是这样。 “感谢您确认自己的帐户,请登录”。不要自动登录,因为这可能是一个安全问题,特别是如果他们有一个包含敏感信息的“个人资料”。
在未确认用户忘记密码的情况下。告诉他们他们必须先确认他们的帐户,提议重新发送电子邮件。之后,让他们通过电子邮件重置密码。它很笨重,但如果你解释为什么他们必须经历这个,用户可能会理解。他们是忘记所有信息的人,所以他们不应该对你太苛刻。