【问题标题】:Generating unique strings for email activation links PHP为电子邮件激活链接 PHP 生成唯一字符串
【发布时间】:2015-07-10 22:05:41
【问题描述】:

我的问题有点棘手,找不到有效表达它的正确方式。 我正在创建一个独特的激活字符串/链接,它结合了 PHP 中的散列用户名和时间。 但是,将数据发送到我的数据库的确切时间和将电子邮件激活链接发送到用户的电子邮件帐户所需的实际时间是不同的(可能以毫秒为单位,有时以秒为单位)——这基本上意味着我有不同的电子邮件我的数据库和电子邮件帐户中的激活链接。 让我展示一个代码sn-p:

$username = $_POST[‘username’];
$table = ‘users’;
$activate_field = ‘activate’;
$activate_code = md5($_POST[‘username’]) +  time(); //provides unique code for activating
//few more lines of code then…
$query = $connect-> prepare(“INSERT INTO $table $acivate_field VALUES $activate_code”);
$query->execute();

//then the long code for sending the email with the activation code appended to the user’s email account

是否有更好的方法可以每秒生成唯一的字符串? 感谢您的宝贵时间并感谢任何帮助和/或建议。P.S 我正在使用 phpmailer 发送电子邮件。

【问题讨论】:

  • 您可以简单地将唯一字段(例如电子邮件或用户名)和md5 它。在这种情况下它将是独一无二的。
  • 时间不同是正常的,你只需要两次操作都使用一次。当您将信息保存在数据库中时,这是一项成本更高的操作。您必须利用这段时间发送链接和其他所需的操作。
  • 那么$activate_code 的值应该只被评估一次,所以没有理由它们应该不同。 time 也已经在几秒钟内了。您确定//few more lines of code then... 部分中的某些内容没有修改$activate_code
  • 另外,您尝试使用算术加法运算符 (+) 将字符串(md5() 返回字符串)与 int(返回值 time())连接起来。由于md5 不返回由 php 直接解析为 int 的值,因此结果将被解释为 0 并且您当前正在丢失您的 ID 的 md5 部分。 (例如小提琴:Link
  • 感谢您的帮助和建议,@Andrew 这个答案可能是我将要实施的,感谢您提出的宝贵意见,以后会考虑。

标签: php email phpmailer


【解决方案1】:

mysql 中的UUID() 更好,但是 php 中的 uniqid() 带有 microtime 前缀可能是一个不错的选择。

【讨论】:

  • PHP 的 uniqid 已经是基于 microtime 的,也不需要在其前面加上 microtime。仅当您跨多个主机生成 ID 时才需要前缀(为了仍然确保唯一性,您会告诉每个主机使用不同的前缀)
【解决方案2】:

只需将生成的代码写入变量,然后将变量写入邮件和数据库 正如我所看到的,在将代码包含在查询中之前,您已经将代码保存在变量中

附带说明,您不应该直接访问像 $_POST 这样的超全局变量,因为用户输入可能是恶意的 出于同样的原因,您应该使用 PDO 准备好的语句而不是字符串构建查询

【讨论】:

  • 我看到使用 $_POST 的唯一地方是md5'd,这将产生一个 SQL 安全字符串。只要$username 以后不直接放入 SQL 查询中,这看起来就很好。
【解决方案3】:

你可以md5,结合uniqidtime,所以它在同一秒也是唯一的。

$activate_code = md5(uniqid(time()));

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 2014-10-20
    • 2014-06-11
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    相关资源
    最近更新 更多