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