【发布时间】:2021-10-06 21:26:27
【问题描述】:
我是 php 新手,我正在自学,通常我创建我的令牌并将它们插入到这样的表格中:
private function create_token($reference, $bytes, $slice)
{
$key = substr(preg_replace('/\W/', "", base64_encode(bin2hex(random_bytes($bytes)))), 0, $slice);
return $reference . $key;
}
function create_token('token_B8', 34, 22); //token_B8eEr32EEddDsfSDGRGgHHhg
这可能是创建令牌的正确方法,但我怀疑这是否真的是正确的方法,我在想,显然在同一张表中有 2 个令牌并且从 1 到 1000000000 正确吗?或者有没有办法创建一个令牌,上面写着:
Under no circumstances create an equal token
无需创建函数来检查表中的令牌是否已存在。
我相信我应该做的是创建一个令牌,我创建它的方式是创建一个函数来检查这个令牌是否已经存在于表中,如果存在,它会生成另一个令牌,如果没有,则将其插入桌子。这似乎是一个正确的方法,但由于我是新手,我不知道是否有更合适的方法,有人可以让我摆脱这个疑问吗?谢谢
【问题讨论】:
-
为什么要使用 subst、preg_replace 和 base64_encode?为什么不把
bin2hex(random_byres($bytes))放在你想要的长度上? -
如果 db 表中的该字段被设置为
unique key时再加上令牌之间发生碰撞的巨大可能性应该足够了......? -
我使用 subst 不让我的字符串超过一定长度,使用 preg_replace 替换由于 base64_encode 而不是字母、数字或 '_' 的内容,并使用 base64_encode 使我的令牌资本和小写。
-
@ProfessorAbronsius 我用的是唯一键,但是,唯一键允许表中有唯一值,但是如果已经有值就不插入值了
-
@ProfessorAbronsius 我想知道是否有任何方法可以生成极其独特的令牌,我不知道使用 bin2hex(random_byres($bytes)) 如何生成极其独特的令牌,我想巧合存在,并且可能在我生成一个小时或另一个小时的方式中会出现一个相等的标记