【问题标题】:Method of securely inviting users to setup account安全邀请用户设置帐户的方法
【发布时间】:2011-08-03 09:18:24
【问题描述】:

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

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

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

【问题讨论】:

    标签: php mysql security


    【解决方案1】:

    IMO 最好的方法是不生成密码,而只生成一个随机散列,该散列可以存储在单独的表中或与用户表一起存储。以下可用作表结构:

    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
    

    现在,无论何时添加用户,信息都会存储在用户表中,并在邀请中生成一个条目。发送的电子邮件包含类似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 天内仍未收到用户的回复,则会自动删除邀请。

    【讨论】:

    • 对于链接中的散列,仅使用随机数的 md5 或 sha1 散列就足够了吗?
    • 是的,sha1 或 md5 就足够了,只要确保在邀请使用后将其删除即可。
    【解决方案2】:

    为了安全起见,最好由程序生成一个随机的真棒密码。用户可以根据需要对其进行更改,但您已为保护应用尽了自己的一份力。

    【讨论】:

    • 生成一个很棒的密码是一回事,但你最终必须告诉用户。将密码发送到用户电子邮件是一种不好的做法。
    【解决方案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 帮助您跟踪注册日期和邀请所有者。

    【讨论】:

    • 感谢您的回复。我想我会实施这个解决方案,但由于 Ravi 早些时候发布了这个想法,我不得不接受他的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    相关资源
    最近更新 更多