【问题标题】:How to deal with user email change如何处理用户电子邮件更改
【发布时间】:2015-11-24 00:55:37
【问题描述】:

我正在为我的用户添加一个选项来更改他们的电子邮件,并且我正在考虑以安全且万无一失的方式进行此操作的最佳方法.. 到目前为止,我有以下选项

1) 当用户更改邮件时,系统会在数据库中的一个临时列中存储并发送一封邮件给新邮件,要求用户单击链接确认,然后才更改它(我需要 2我的数据库上的额外字段 - temp_email 和 email_token)

2) 当用户更改邮箱时,系统会从AccountID和New Email中收集数据,加密后发送到新邮箱。当用户点击链接时,系统会解密并相应更改。

我真的很喜欢第二个选项,因为它不需要在数据库中保存额外的字段。所以我的问题是......哪个是更好的解决方案?或者也许是第三个..

【问题讨论】:

  • 您对加密的信任程度如何?
  • 不多,我只是用普通的php加密,没什么花哨的
  • 旁注:在请求更改时需要询问密码,以防用户在某处保持登录状态。
  • @rybo111 你当然可以这样做。我相信 Twitter 会。
  • @rybo111 问题是.. 如果用户使用 facebook 登录并且没有密码怎么办?

标签: php email


【解决方案1】:

我的users 表中有两个字段:recovery_hashrecovery_time,当用户更改某些内容时它们会更新。我输入了一个随机哈希和当前时间。

然后我向那个人发送一封电子邮件(在您的情况下,发送到他们的新地址),链接中包含哈希 (http://foobar.com/verify/randomHashG03sHere)。用户单击该链接并转到服务器上的验证脚本 - 该脚本验证哈希,然后检查当前时间是否在 recovery_time 的一个小时内。如果两项检查均有效,我将进行更改,在您的情况下,将使用新的电子邮件地址更新用户 email 字段 - 您可以将其存储在单独的表中,甚至与 @987654328 存储在同一个用户表中@字段。

由于您预计用户想要更改内容,您可以将新电子邮件地址存储在单独的表中,例如 users_temp.email,然后在验证后使用该新值更新 users 表。

【讨论】:

  • 感谢分享。我喜欢使用通用恢复令牌系统的想法。我正在使用 password_recovery_token 并且害怕构建一个单独的电子邮件更改令牌的想法,我想我只是将它概括为 recovery_token 并根据所需的操作发送不同的电子邮件。我不喜欢仅为新电子邮件创建临时表的想法,所以也许我会在发出的 url 中包含新电子邮件,并在用户单击链接时保存它。
  • 我认为将用户的电子邮件地址放在 url 中不是一个好主意。几年前我在一个项目中这样做了,它导致一些包含特殊字符的地址出现问题,例如+。在你决定之前阅读这些答案:stackoverflow.com/questions/20400250/email-addresses-inside-url
【解决方案2】:

您可以创建另一个表来处理临时电子邮件地址(电子邮件 + AccountID + 令牌 + 时间戳(可能))。

【讨论】:

    【解决方案3】:

    我会极力避免选项 2。将所有数据保存在本地服务器上!万一有人破坏了您的加密,他可能会弄乱您的整个数据库或网络服务。尤其是凭证或电子邮件地址永远不应外包。更推荐使用选项 1,尽管数据也可以以不同的方式存储。

    【讨论】:

      猜你喜欢
      • 2018-12-28
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      • 2021-10-05
      • 1970-01-01
      • 1970-01-01
      • 2020-07-29
      • 2015-05-20
      相关资源
      最近更新 更多