当管理员发送带有令牌的链接时(我们经常会看到帐户激活或密码续订),我需要访问未注册访问者的网站特定页面。
显然,令牌必须是唯一的,因为令牌本身将决定访问者可见的内容(令牌将存储在MySQL DB中,具有访问权限,状态,到期等...)
这就是我所拥有的,从多个来源汇集在一起:
$key = '#}~*$/"$?&*(."*/[!%]/${"/}';
$unique = uniqid();
$token = $unique.substr(hash('sha512',$unique.$key.microtime()), 0, 19);
它产生一个32个字符的字符串,前13个字符串可以反转以获得创建时间,最后19个字符串可以添加唯一性。
这是否足够独特/安全。?
对于URL令牌,是否足够长。?
答案 0 :(得分:2)
这似乎比你可能需要它更安全(不知道你想要阻止的确切数据)。如果您愿意,您可以将令牌仅用于一个会话,或者您觉得可以为访问者提供多个会话。你可以这样做,如果他们用尽了令牌,他们在一个会话中被给出但是没有完成他们需要做的事情,他们需要让另一个回去,如果这是合理的。
然而,您正在做的事情是充足的安全性。有人可以获得令牌的唯一方法是,如果他们猜测并且那些令牌很难猜测。除非你过分担心海盗会得到你的信息,否则这并不是什么大不了的事。由于它是一个网址令牌,因此您发送的电子邮件或其他所有人都可以看到它。你显然必须让它可见。
您可以使其更加安全的唯一方法是为用户提供一个令牌,他们可以使用该令牌创建自己的哈希密码。然后你不存储密码,它更安全。