【问题标题】:Email activation security checksum电子邮件激活安全校验和
【发布时间】:2011-06-23 22:16:42
【问题描述】:

我一直在向我的网站询问一些反馈,我收到的一条评论如下

“我使用 email@email.com 注册并成功地使用 http://www.mysite.co.uk/activateuser.php?email=email@email.com 激活了我的帐户

你需要校验和来阻止它。”

谁能详细说明这一点以及我如何将它们实施到我的激活中?


理论上,如果我要在我的数据库中创建一个名为“rand_key”的行,并且当用户注册一个随机密钥存储在该列中时,我可以将其用作激活而不是电子邮件吗?从而使其不可猜测?​​

【问题讨论】:

    标签: php checksum


    【解决方案1】:

    您需要创建一个唯一的用户密钥,该密钥不应与用户数据相关。通常你可以做一些事情,比如散列随机生成器函数的输出,以使其独一无二并使用它。然后将它们指向链接:

    http://www.mysite.co.uk/activateuser.php?userid=generated-unique-hashed-key

    这个唯一的用户密钥应该作为一个额外的字段添加到您存储用户信息的表中,或者以其他方式与用户相关。通过保持密钥与用户数据无关,您可以确保没有人可以发现用户的密钥并恶意激活/执行其他操作而不是您的用户。

    那么您应该在到达时测试用户密钥的某些条件:

    • 尚未授权 - 授权
    • 已授权 - 一些错误
    • 错误的键 - 一些错误

    另外,应该有一个与您的用户相关的到期日期,您只需在此日期后停用该用户及其密钥。

    【讨论】:

      【解决方案2】:

      此人的意思是您可以通过转到该 url 并将电子邮件地址放入 thr url 来激活您的地址。您可以在没有实际收到激活电子邮件的情况下执行此操作。

      通过使用校验和,您可以强制用户点击链接。例如。 激活.php?email=aaa@bbb.com&check=A1234b23

      在发送电子邮件时,您会生成一个随机代码。将其存储在您的数据库中的某个地方。将其附加到用户提供的 url。当用户单击链接时,您检查代码是否与为该电子邮件地址存储的代码匹配。如果匹配,请验证电子邮件。否则不要。

      【讨论】:

      • 根本不需要URI中的电子邮件。只需发送一些长而难以猜测的号码。
      • 如果它只是一个数值,我可以编写一个从 0 到 1 亿的脚本,然后激活所有地址。电子邮件+字母数字代码是最好的方式
      【解决方案3】:

      理论上,如果我要创建一行 在我的数据库中命名为“rand_key”,当 用户注册一个随机密钥被存储 在专栏中,我可以使用这个吗 作为激活而不是 电子邮件?从而使其不可猜测?​​

      是的。请记住,您不一定想要随机的,而是想要唯一的(为了避免两个电子邮件地址意外获得相同的激活码)。

      你可以这样做:

      $key = mt_rand().'-'.uniqid('', true);
      
      echo 'http://mysite.com/activate?key='.urlencode(base64_encode($key));
      

      这很难猜到,而且保证是独一无二的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-22
        • 1970-01-01
        • 2014-06-24
        • 2014-02-10
        • 1970-01-01
        • 2013-01-13
        • 2018-03-26
        • 1970-01-01
        相关资源
        最近更新 更多