【发布时间】:2014-01-15 11:11:59
【问题描述】:
我有这个CSRF保护功能,太疯狂了。
function GenToken($ranLen) {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$()';
$randomString = '';
for ($i = 0; $i < $ranLen; $i++) {
$randomString .= $characters[rand(0, strlen($characters) - 1)];
}
return $randomString;
}
它是这样调用的:
$token = GenToken(rand(32,128));
它使用 PHP 的 rand(),我知道它在创建随机数方面远非理想。
我想知道的是它有多糟糕?此功能是否适用于“良好”(被授予古怪)CSRF 保护?它肯定会生成一个字符串。
目前该功能仅用于 CSRF,但它可以用于其他短随机字符串,例如通过电子邮件发送给用户以激活其帐户等的代码。这可以接受吗?
【问题讨论】:
-
对你的目的来说没问题,它会非常随机,无法“预测”。
-
关于通过电子邮件激活,只要您不让心怀恶意的人尝试无数次使用不同代码的激活请求,这可能是可以的(这也意味着您的激活密码不应该太短了)。
-
可能与您的问题有关:stackoverflow.com/a/7808258/1961059
-
谢谢,看来把
rand()简单地改成mt_rand()总比没有好。 -
@TraceRace - 使用
openssl_random_pseudo_bytes,它将完美无缺。