我正在开发一个基于Web的系统(PHP和MySQL),该系统具有可以登录的用户。问题是所有这一切都必须非常安全。现在,我已经了解了如何存储密码,我们使用加密连接,并采取了许多其他安全措施。
我需要解决的最后一个问题是,设置帐户的管理员(即输入姓名和电子邮件地址)必须邀请用户加入应用程序。他需要能够将生成的电子邮件发送给包含链接的新用户。如果用户点击该链接,他将被带到系统,他将不得不设置他的密码。发送这类电子邮件的最佳做法是什么?我知道我应该使用某种由特定用户信息组成的哈希,以确保页面上的用户实际上是点击链接的用户。我应该采取什么其他措施?
或者自动生成随机密码会更好,通过电子邮件发送给新用户并让他在首次登录后更改密码?
答案 0 :(得分:1)
对于安全措施,最好通过程序生成随机可怕的密码。用户可以根据需要进行更改,但您已经完成了保护应用程序的工作。
答案 1 :(得分:1)
IMO最好的方法是不生成密码,而只是一个随机散列,可以存储在单独的表中,也可以存储在users表中。以下内容可用作表格结构:
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值为true,否则无法使用用户帐户,即您的查询类型为“SELECT fields FROM users WHERE userid = $ userid AND isactive = 1”。此外,您可以使用邀请中的senton值来检查用户是否未接受邀请,然后您可以再次发送包含该链接的电子邮件(比如3天之后)以及拒绝邀请的选项。如果您仍未在3天内收到用户的回复,则会自动删除邀请。
答案 2 :(得分:1)
与第一个答案相同,但在db结构和处理方式上有一些不同。
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=0
和inviteProcessTime=CURRENT_TIMESTAMP
,那么将来没有人可以使用此链接,我们也可以跟踪此活动的时间
invitationCount
字段可帮助您管理和限制每个用户的邀请时间。
users.inviteId
可帮助您跟踪注册日期和邀请所有者。