我在我的 Rails 3.0 应用程序上使用 Devise,我们目前已启用可确认和可恢复。这些模块要求用户确认他们的电子邮件帐户(可确认),并允许用户通过将电子邮件发送到他们的电子邮件帐户(可恢复)来重置他们的密码。
不幸的是,我们很难“设计”(双关语)允许用户在不确认其帐户的情况下使用该网站的合理安全策略。我们强制执行以下安全要求:
确认您的帐户需要登录或登录。如果不是这种情况并且用户 A 不小心输入了恶意用户 B 的错误电子邮件地址,B 将收到确认电子邮件链接,自动登录,然后可以从那里重置密码通过“电子邮件重置密码链接”。要求 B 使用 A 的凭据登录可以消除这种可能性。
通过电子邮件重置密码需要确认电子邮件。这是因为如果用户 A 不小心输入了错误的电子邮件地址,一个属于恶意用户 B 的电子邮件地址,那么 B 将收到确认电子邮件链接并且知道 A 已经注册了一个帐户。因此 B 可以访问该站点并使用重置密码功能来更改帐户的密码,然后可以确认他的帐户。要求确认的电子邮件地址消除了这种可能性。
所以一切都很好。除非用户 A 创建了一个帐户,但尚未确认他的帐户,然后返回该站点并忘记了他的密码。这里 A 陷入了一个循环依赖循环,重置他的密码需要确认他的帐户,但确认他的帐户需要使用他忘记的密码登录。
两种可能的解决方案:
要求用户在登录后立即确认他们的帐户。这会产生更多的注册摩擦,但消除了循环依赖。
允许用户在没有确认帐户的情况下重置密码,但不允许用户在确认帐户之前输入任何敏感信息或执行关键操作。这样恶意用户 B 仍然可以劫持帐户,但他将在没有任何有价值的信息或权力的情况下获得对帐户的控制权。
有更好的解决方案吗?企业如何处理这个问题?我已经使用了几个不需要立即电子邮件确认的网站,所以如果我们能以一种不需要实现像 #2 那样复杂的东西的方式来做到这一点,那就太好了。
谢谢!