Php 激活器链接:哪种设计方式最好?

Php 激活器链接:哪种设计方式最好?,php,security,Php,Security,我使用的是PHP,我知道这个网站上有很多类似的问题。但我没有找到一个很好的精辟的解释,比如: 激活器链接的约定 activators链接上的常见漏洞 现在,我认为我只有以下选项来设计一个好的激活器链接: 在users表中存储一个唯一的令牌,并使用两个参数来验证帐户激活:用户标识符和数据库中各自的令牌。可能是这样的: $user->token=bin2hex(openssl_随机_伪_字节(16)) hostname/accountConfirm?user=username&token=use

我使用的是PHP,我知道这个网站上有很多类似的问题。但我没有找到一个很好的精辟的解释,比如:

  • 激活器链接的约定
  • activators链接上的常见漏洞
现在,我认为我只有以下选项来设计一个好的激活器链接:

  • 在users表中存储一个唯一的令牌,并使用两个参数来验证帐户激活:用户标识符和数据库中各自的令牌。可能是这样的:

    $user->token=bin2hex(openssl_随机_伪_字节(16))

    hostname/accountConfirm?user=username&token=userUniqueToken

  • 仅使用一个参数作为具有哈希秘密值+用户电子邮件字符串的令牌。此选项不需要任何数据库列来存储令牌。大概是这样的:

    $secret='some_secret_string'

    $hashedToken=密码\u散列($secret.$user->email,密码\u默认值)

    hostname/accountConfirm?token=($hashedToken)

  • 我的问题是:

    • 这些方法的优点和缺点是什么

    • 如果有,还有什么好的解决方案


    访问数据库的风险比不访问数据库的风险更大,尤其是对于未经身份验证的用户。通过使用基于散列的消息身份验证码(HMAC),可以避免在此步骤中访问数据库。这也减缓了脚本小子尝试填充数据库的速度

    所以,我喜欢你的第二个选择,但你仍然需要保留电子邮件地址/用户名

    这是我使用的(伪代码):

    将URL发送到$email

    在accountConfirm处理程序中:

    $email = $_GET['email'];
    $expires = $_GET['expires'];
    $userIP = $_GET['ip'];
    $hmac = $_GET['hmac'];
    
    $expectedHmac = hmac_function( $serverSecret, $email + $expires + $userIP);
    
    if($expectedHmac != $hmac) {
      log 'evil request';
      throw 400 error;
    }
    
    //check user ip
    //check expiry time
    //proceed with registration
    

    如果有人弄乱了IP、电子邮件地址或到期时间,HMAC将不匹配。

    我选择方法1,令牌与用户的私人信息完全无关。黑客无法根据其他信息破译唯一令牌。他们被迫使用暴力攻击。如果您的唯一字符串足够长,则需要相当长的时间才能断开。也可能用htaccess重写激活url。你可以向我解释为什么我需要使用反用户ip吗?你不需要。这将允许您检查注册请求是否来自与确认Click相同的ip是的,我理解这一部分,但这不会限制用户在这些不同的操作中使用相同的设备,或者我是否感到困惑??我不理解您最后的评论。
    $email = $_GET['email'];
    $expires = $_GET['expires'];
    $userIP = $_GET['ip'];
    $hmac = $_GET['hmac'];
    
    $expectedHmac = hmac_function( $serverSecret, $email + $expires + $userIP);
    
    if($expectedHmac != $hmac) {
      log 'evil request';
      throw 400 error;
    }
    
    //check user ip
    //check expiry time
    //proceed with registration