在自定义电子邮件中发送未散设的Devise reset_password_token

时间:2016-12-19 19:05:49

标签: ruby-on-rails devise devise-recoverable

我在我的Rails 4.2应用程序中使用Devise 3.5。我已经用自定义HTML电子邮件覆盖了所有股票电子邮件。由于我设计电子邮件传递代码的方式,电子邮件模板无法访问令牌的哈希版本,例如reset_password_token

我遇到的问题是电子邮件模板只能访问存储在数据库中的未散列令牌。我尝试在我的电子邮件模板中使用数据库中的未散列令牌,但当用户点击该链接时,设计PasswordsController#update调用resource_class.reset_password_by_token(resource_params)Devise::Recoverable然后取消标记令牌并尝试查找用户。这是失败的,因为未散列的令牌与数据库中的令牌不匹配(因为令牌已经开始时没有散列)。

我的问题分为三部分:

  1. 在电子邮件中发送未散列的令牌有什么安全隐患,例如密码重置电子邮件?
  2. 我假设发送未散列的令牌是个坏主意。如果是这样,我是否可以通过覆盖PasswordsController#create来解决此问题,以便我可以拦截散列和未散列的令牌并将两者保存到数据库中,从而使散列令牌可用于我的邮件代码?在尝试这种方法之前,我应该注意安全隐患吗?
  3. 在呈现我的电子邮件模板之前,有什么方法可以使用未散列的令牌并将其哈希,这样我就可以避免使用hacky解决方法,例如将其保存到数据库中?

1 个答案:

答案 0 :(得分:1)

您的假设不正确。未散列的令牌可以安全地通过电子邮件发送,但不安全存储在数据库中。这样,有权访问您的数据库的人无法重建密码重置URL。

因此,您希望电子邮件只能访问未散列的令牌。

有关更详细的讨论,请参阅http://blog.plataformatec.com.br/2013/08/devise-3-1-now-with-more-secure-defaults/

中的“在数据库中存储消化的令牌”