在自定义电子邮件中发送未经哈希处理的 Devise reset_password_token
Sending unhashed Devise reset_password_token in custom email
我在 Rails 4.2 应用程序中使用 Devise 3.5。我已经用自定义 HTML 电子邮件覆盖了所有库存电子邮件。由于我设计电子邮件传送代码的方式,电子邮件模板不可能访问令牌的散列版本,例如 reset_password_token
。
我遇到的问题是电子邮件模板只能访问存储在数据库中的未散列令牌。我已经尝试在我的电子邮件模板中使用数据库中未散列的令牌,但是当用户单击 link 时,Devise 的 PasswordsController#update
调用 resource_class.reset_password_by_token(resource_params)
。 Devise::Recoverable 然后取消散列令牌并尝试找到用户。这失败了,因为未散列的令牌与数据库中的令牌不匹配(因为令牌已经开始未散列)。
我的问题分为三部分:
- 在密码重置电子邮件等电子邮件中发送未经哈希处理的令牌对安全有何影响?
- 我假设发送未经哈希处理的令牌是个坏主意。如果是这样,我可以通过覆盖
PasswordsController#create
来解决这个问题,这样我就可以拦截散列和未散列的令牌并将它们保存到数据库中,从而使散列令牌可用于我的邮件程序代码吗?在尝试这种方法之前,我应该注意安全隐患吗?
- 有没有什么方法可以在呈现我的电子邮件模板之前获取未经哈希处理的令牌并对其进行哈希处理,从而避免将其保存到数据库等棘手的解决方法?
您的假设不正确。未经哈希处理的令牌可以安全地通过电子邮件发送,但存储在数据库中是不安全的。这是为了让有权访问您的数据库的人无法重建密码重置 URL.
所以您希望电子邮件只能访问未散列的令牌。
有关更详细的讨论,请参阅 "Store digested tokens in the database" http://blog.plataformatec.com.br/2013/08/devise-3-1-now-with-more-secure-defaults/
我在 Rails 4.2 应用程序中使用 Devise 3.5。我已经用自定义 HTML 电子邮件覆盖了所有库存电子邮件。由于我设计电子邮件传送代码的方式,电子邮件模板不可能访问令牌的散列版本,例如 reset_password_token
。
我遇到的问题是电子邮件模板只能访问存储在数据库中的未散列令牌。我已经尝试在我的电子邮件模板中使用数据库中未散列的令牌,但是当用户单击 link 时,Devise 的 PasswordsController#update
调用 resource_class.reset_password_by_token(resource_params)
。 Devise::Recoverable 然后取消散列令牌并尝试找到用户。这失败了,因为未散列的令牌与数据库中的令牌不匹配(因为令牌已经开始未散列)。
我的问题分为三部分:
- 在密码重置电子邮件等电子邮件中发送未经哈希处理的令牌对安全有何影响?
- 我假设发送未经哈希处理的令牌是个坏主意。如果是这样,我可以通过覆盖
PasswordsController#create
来解决这个问题,这样我就可以拦截散列和未散列的令牌并将它们保存到数据库中,从而使散列令牌可用于我的邮件程序代码吗?在尝试这种方法之前,我应该注意安全隐患吗? - 有没有什么方法可以在呈现我的电子邮件模板之前获取未经哈希处理的令牌并对其进行哈希处理,从而避免将其保存到数据库等棘手的解决方法?
您的假设不正确。未经哈希处理的令牌可以安全地通过电子邮件发送,但存储在数据库中是不安全的。这是为了让有权访问您的数据库的人无法重建密码重置 URL.
所以您希望电子邮件只能访问未散列的令牌。
有关更详细的讨论,请参阅 "Store digested tokens in the database" http://blog.plataformatec.com.br/2013/08/devise-3-1-now-with-more-secure-defaults/