2010-10-10 40 views
0

当管理员发送带有令牌的链接时(例如我们经常看到的帐户激活或密码更新),我需要访问网站的特定页面以取消注册访问者。这是一种在PHP中创建唯一URL标记的好方法。

显然,令牌必须是唯一的令牌本身将决定什么是可见的访问者(令牌将被存储在MySQL数据库与给定的接入,状态,有效期等)

这是我已经从多个数据源混搭在一起:

$key = '#}~*$/"$?&*(."*/[!%]/${"/}'; 
$unique = uniqid();  
$token = $unique.substr(hash('sha512',$unique.$key.microtime()), 0, 19); 

这导致了32个字符的字符串,与第13,可以逆转以获取添加独特的最后19创造了时间和金钱。

这是独一无二的吗?

对于URL令牌,长度足够长。

+0

您将无法颠倒sha512散列来获得创建的时间。 sha512是单向散列。你可以尝试字典攻击自己,以获得创建的时间,但这是非常荒谬的。 – Asaph 2010-10-10 15:40:31

+0

不,我仍然有$独特的未触及,然后SHA512散列substr ... – pnichols 2010-10-10 15:42:32

+0

那么,什么? microtime()'仍然不可逆转地散列,因此永远失去。 – Asaph 2010-10-10 15:44:27

回答

2

这似乎比你所需要的更安全(不知道你试图排除什么数据)。如果你愿意,你可以让令牌只用于一个会话,或者无论你觉得多少会话都足以给访问者。你可以这样做,如果他们在一次会议中使用了令牌,但没有完成他们需要做的事情,他们需要让另一个回来,如果这是合理的。

但是,您正在做的事情对于安全性来说还是很多的。有人可以得到令牌的唯一方法是如果他们猜测并且这些令牌很难猜测。除非您过分担心海盗获取您的信息,否则不是一件大事。由于它是一个网址令牌,因此您可以在发送给您的电子邮件中的任何人看到它或任何其他内容。您显然必须使其可见。

您可以使其更安全的唯一方法是为用户提供一个令牌,他们可以使用该令牌创建自己的散列强密码。那么你没有存储密码,它更安全。

相关问题