我正在为我的用户添加一个选项来更改他们的电子邮件,而我正在考虑以安全和万无一失的方式执行此操作的最佳方式..到目前为止,我有以下选项
1)当用户更改电子邮件时,系统会存储在数据库的临时列中并向新服务器发送电子邮件,要求用户单击该链接进行确认,然后再进行更改(我需要2我的数据库上的额外字段 - temp_email和email_token)
2)当用户更改电子邮件时,系统将从AccountID和新电子邮件中收集数据,对其进行加密并将其发送到新电子邮件。当用户单击该链接时,系统会对其进行解密并相应更改。
我真的很喜欢第二个选项,因为它不需要在数据库上保存额外的字段..所以我的问题是..哪一个是更好的解决方案?或许是第三个......
答案 0 :(得分:3)
我的users
表中有两个字段:recovery_hash
和recovery_time
,当用户更改内容时会更新。我输入了一个随机哈希和当前时间。
然后我向该人发送电子邮件(在您的情况下,发送到他们的新地址),并在链接中是哈希(http://foobar.com/verify/randomHashG03sHere
)。用户单击该链接,然后转到服务器上的验证脚本 - 验证散列,然后检查当前时间是否在recovery_time
的一小时内。如果两个检查都有效,我会进行更改,在您的情况下,将使用新的电子邮件地址更新用户email
字段 - 您可以将其存储在单独的表中,甚至可以存储在相同的用户表中new_email
字段。
由于您预计用户想要更改内容,您可以将新电子邮件地址存储在单独的表中,例如users_temp.email
,然后在验证后使用该新值更新users表。
答案 1 :(得分:1)
您可以创建另一个表来处理临时电子邮件地址(电子邮件+ AccountID +令牌+时间戳(可能))。
答案 2 :(得分:0)
我会高度避免选项2.将所有数据保存在服务器本地!如果有人破坏了您的加密,他可能会搞乱您的整个数据库或Web服务。特别是凭证或电子邮件地址永远不应外包。更推荐选项1,但数据也可以以不同的方式存储。