安全邀请用户设置帐户的方法


Method of securely inviting users to setup account

我在一个基于web的系统(PHP &MySQL),有可以登录的用户。问题是所有这些都必须非常安全。现在,我已经了解了如何存储密码,我们使用加密连接,并采取了许多其他安全措施。

我需要解决的最后一个问题是设置帐户的管理员(即。输入姓名和电子邮件地址)必须邀请用户进入应用程序。他需要能够将生成的电子邮件发送给包含链接的新用户。如果用户单击该链接,他将被带到系统,他必须设置他的密码。发送这类电子邮件的最佳做法是什么?我意识到我应该使用某种由特定用户信息组成的散列,以确保在页面上的用户实际上是点击了链接的用户。我还应该采取什么措施?

或者自动生成一个随机密码,通过电子邮件发送给新用户,让他在第一次登录后更改密码会更好吗?

在我看来,最好的方法是不生成密码,而只是一个随机哈希,可以存储在单独的表中,也可以存储在用户表中。

users:
userid
name
email
password //any hashing technique you prefer
isactive //bool always false when user is created
invites:
inviteid
userid
hash
reinvitesent //boolean
senton

现在,每当添加一个用户时,信息就存储在users表中,并在邀请中生成一个条目。发送的电子邮件包含类似https://yoursite.com/user/activate.php?userid=x&hash=7a657ab435f4543543543543的链接。如果用户id和散列匹配,请用户选择他/她的密码。如果密码修改成功,则将isactive更改为true。

一个用户帐户不能被使用,除非isactive值为真,即你的查询将是类型'SELECT fields FROM users WHERE userid = $userid AND isactive = 1'。你也可以在邀请中使用senton值来检查用户是否还没有接受邀请,然后你可以再次发送带有链接的电子邮件(假设在3天后),并提供拒绝邀请的选项。如果3天后仍未收到用户回复,则自动删除邀请。

为了安全起见,最好由程序生成一个随机的令人敬畏的密码。用户可能会改变它,因为他们认为合适,但你已经做了你的部分在保护应用程序。

与第一个答案相同,但在数据库结构和处理方式上有所不同。

Table users: userId, username, password, email, isActive (optional), invitationCount, inviteId.
Table invites: inviteId, inviteUserId, inviteHash, isValid, inviteProcessTime.

新用户链接为:http://yoursite.com/invite.php?code={inviteHash}

inviteHash可以很容易地使用当前时间或与userId组合生成。

inviteHash = md5(time().$userId);

当用户点击链接时,我们从db中检查这个哈希值。如果它确实存在并且状态为isValid = 1(表示此链接以前未使用过)。然后处理到注册页面。这一步新用户可以输入任何他们想要的数据。如果他们成功创建新帐户,然后更新isValid=0inviteProcessTime=CURRENT_TIMESTAMP,那么以后没有人可以使用这个链接,我们也可以跟踪它被激活的时间

表users中的

invitationCount字段帮助您管理和限制每个用户的邀请时间。users.inviteId帮助您跟踪注册日期和邀请所有者。