0

我在我的 Rails 4.2 应用程序中使用 Devise 3.5。我已经用自定义 HTML 电子邮件覆盖了所有库存电子邮件。由于我设计电子邮件传递代码的方式,电子邮件模板不可能访问令牌的散列版本,例如reset_password_token.

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

我的问题分为三部分:

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

1 回答 1

1

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

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

有关更详细的讨论,请参阅http://blog.plataformatec.com.br/2013/08/devise-3-1-now-with-more-secure-defaults/上的“在数据库中存储消化的令牌”

于 2016-12-19T19:11:26.730 回答