【问题标题】:Is this a good way to create a unique URL token in PHP.?这是在 PHP 中创建唯一 URL 令牌的好方法吗?
【发布时间】:2010-10-10 15:31:40
【问题描述】:

当管理员发送带有令牌的链接时(就像我们经常看到的帐户激活或密码更新),我需要向未注册的访问者授予对网站特定页面的访问权限。

显然,令牌需要是唯一的,因为令牌本身将决定访问者可见的内容(令牌将存储在 MySQL 数据库中,并提供访问权限、状态、到期等...)

这是我所拥有的,来自多个来源:

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

它产生一个 32 个字符的字符串,前 13 个可以反转以获得创建的时间,最后 19 个用于添加唯一性。

这足够独特/安全吗?

对于 URL 令牌来说,32 是否足够长?

【问题讨论】:

  • 您将无法反转您的 sha512 哈希来获取创建的时间。 sha512 是一种单向哈希。您可以尝试对自己进行字典攻击以创建时间,但这太荒谬了。
  • 不,我还有 $unique 不变,然后是 sha512 哈希的 substr...
  • 那又怎样? microtime() 仍然被不可逆地散列,因此永远丢失。
  • 所以我不需要 microtime()。!它只是在那里添加一些要散列的东西。 uniqid() 可以反转为时间戳,如果我需要得到它就足够了。无论哪种方式,可逆性都不是这个目标......

标签: php security url


【解决方案1】:

这似乎比您需要的要安全得多(不知道您要阻止哪些数据)。如果您愿意,您可以使令牌仅用于一个会话,或者您认为足以提供给访问者的任意多个会话。你可以这样做,如果他们用完他们在一次会话中获得的令牌但没有完成他们需要做的事情,他们需要让另一个人回去,如果这是合理的。

但是,您正在做的事情足以保证安全。有人可以获得令牌的唯一方法是他们猜测并且这些令牌很难猜测。除非您过度担心海盗会获取您的信息,否则这并不是什么大不了的事。由于它是一个 url 令牌,因此在您发送的电子邮件或其他任何内容中,每个人都可以看到它。你显然必须让它可见。

您可以使其更加安全的唯一方法是为用户提供一个令牌,他们可以使用该令牌来创建自己的经过哈希处理的强密码。这样你就不用存储密码了,这样更安全。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-04
    • 2019-05-12
    • 2011-08-26
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    相关资源
    最近更新 更多