我有一个新的web项目,用户可以登录到网站。我的客户(网站的所有者)有一个现有客户的数据库,他们想要加载到新的网站。
所以,我在想,我将导入现有的客户到网站的数据库,分配一个随机密码,这是好的1登录,然后必须更改,并通过电子邮件登录的详细信息给用户(以明文密码)。
所以,考虑到电子邮件不安全,我必须假设它是在传输过程中被读取的。所以,假设我给爱丽丝发了一封电子邮件,我想访问我的网站。比如:
A -在Alice阅读电子邮件之前,Nasty Nick阅读并登录到网站,并被迫更改密码。然后Alice尝试登录,但密码不起作用。
B - Alice阅读邮件,登录并设置新密码。讨厌的尼克然后阅读邮件,试图使用密码,但它失败了。
在A的情况下,合法的所有者被锁在外面,并且(大概)会联系我的客户,我们可以采取行动。如果她不联系,尼克将继续访问-但是帐户中没有信息或任何值,直到帐户持有人输入数据。
在情况B中,除了Nick知道系统上存在一个特定的用户名之外,没有任何危害。
我在风险评估中是否遗漏了什么?显然,我更希望人们自己注册,但我的客户希望利用现有的数据库。而且邮寄登录信息太贵了。
还有其他批量导入的方法吗?
编辑如果,而不是发送密码,我发送一个链接/令牌登录用户,然后他们必须设置一个密码,类似于这里建议的忘记密码系统-这是更好吗?
在A的情况下,合法的所有者被锁在外面,并且(可能)会联系我的客户
好吧,除非合法的所有者不希望注册一个在线帐户,所以:
- 不检查他们的邮箱,或者
- 将邮件视为可能的垃圾邮件而忽略或丢弃,或
- 没有收到邮件,因为地址错误或过期
通常为了缓解这个问题,你会:
- 对随机密码/令牌进行时间限制,以便如果Nick在几个月后进入电子邮件帐户,他无法在不产生更多电子邮件噪音的情况下进入该帐户;
- 理想情况下,只有在明确要求 时才发送带有令牌的邮件
B - Alice阅读邮件,登录并设置新密码。
还有一种极端情况,Alice读了电子邮件,登录了,心烦意乱或不感兴趣,所以没有设置新密码。此时,您应该尝试确保初始的"一次性"密码不能重复使用。
如果,而不是发送密码,我发送一个链接/令牌登录用户,然后他们必须设置一个密码,类似于这里建议的忘记密码系统-这是更好吗?
在功能上没有区别,假设两者都是用相同的约束正确实现的。但是,如果你可以重用一些相同的代码来忘记密码和验证电子邮件地址注册,那么你就有更少的代码需要审查,从而更有可能使其安全(并且可能使用户体验更一致)。
彻底使用忘记密码系统可能是个好主意:不要设置初始密码,一开始只发一封信息电子邮件,指导/链接客户使用忘记密码功能来访问。