【问题标题】:Need to hash emailed 'verification' URL?需要散列通过电子邮件发送的“验证”URL?
【发布时间】:2011-09-02 14:59:18
【问题描述】:

我有一个收集基本用户信息的表单。在随后的页面上,它要求用户输入“验证”代码,以确保他们可以访问提到的电子邮件帐户。

此外,如果有人在输入验证码之前不小心完全离开了网站,我将提供一个带有唯一 $_GET 变量的链接,以便他们验证他们的电子邮件地址。

几个问题:

  1. 将验证码存储在数据库中客户电子邮件地址旁边的普通站点(例如代码为 12345)中是否有任何危害?
  2. 是否需要“散列”验证 URL $_GET 变量?我的想法是简单地创建一个 64 个字符的字符串,附加到 URL 的末尾并检查数据库值(再次存储在电子邮件地址旁边)。

我永远不会对用户密码做同样的事情(保持打开未散列)但在这种情况下,正确的方法是什么?

编辑

似乎人们喜欢 GUID 的想法(尽管我不确定它比 64 字符随机生成的字符串更独特)。下面的功能看起来够用吗?

function getGUID(){
    if (function_exists('com_create_guid')){
        return com_create_guid();
    }else{
        mt_srand((double)microtime()*10000);//optional for php 4.2.0 and up.
        $charid = strtoupper(md5(uniqid(rand(), true)));
        $hyphen = "-";
        $uuid = "{"
            .substr($charid, 0, 8).$hyphen
            .substr($charid, 8, 4).$hyphen
            .substr($charid,12, 4).$hyphen
            .substr($charid,16, 4).$hyphen
            .substr($charid,20,12)
            ."}";
        return $uuid;
    }
}

【问题讨论】:

  • 为什么需要用户输入任何内容来验证?点击链接还不够验证吗?
  • @Amir - 同意,但我们组织中的人认为“点击链接”是一种痛苦,并且认为一旦用户点击打开新的浏览器窗口会令人困惑链接(因此同一站点有 2 个窗口)。
  • 只需将世界上所有其他应用程序显示给此人注册,然后单击电子邮件地址上的链接进行验证。 :) 感受你的痛苦 :)
  • @Amir - 他们的例子是银行使用的情况,其中 5 位代码通过电子邮件或短信发送到文件记录并手动输入以继续登录过程。
  • 为什么是$hyphen = chr(45);// "-",为什么不只是$hyphen = "-";

标签: php mysql hash email-verification


【解决方案1】:

只需使用 GUID 就可以了!如果需要,您可以将其存储在另一个表中。无需散列。

【讨论】:

  • 如果你比较偏执,你也可以记录你生成 UUID 的时间,然后在 15 分钟左右后过期。要求慢速用户重新发送新的 UUID。
  • @Karew 我遇到的大多数会在 24 小时后过期。
  • @Daniel A. White - 谢谢。是否有任何现有的 PHP 函数可以完成此任务或只是以 8-4-4-4-12 格式构建?实际上,我看不出这比创建 64 个字符的随机字符串并在这种情况下保存更容易?
  • @Michael 这也行,15 分钟可能有点苛刻。
  • 还有 - 想要简单地输入 5 位数验证码的用户呢?
猜你喜欢
  • 2021-01-16
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
相关资源
最近更新 更多