这是我第一次使用nonce,所以我从http://fullthrottledevelopment.com/php-nonce-library下载了这个脚本.我不喜欢这些代码,特别是因为该函数有可能被视为无效,因为该函数在定义的时间间隔内工作(默认为300秒).
例如,我们可以在生成随机数的300秒内299秒,因此现时只能工作1秒.
我将库修改为以下函数.我所做的是通过使用检查当前间隔和前一个间隔nonce_create(time()-NONCE_DURATION)==$nonce.有没有办法进一步改善功能?:
define( 'NONCE_UNIQUE_KEY' , '123123' );
define( 'NONCE_DURATION' , 300 );
function nonce_create($time=false){
if(!$time)
$time=time();
$i=ceil($time/(NONCE_DURATION));
return substr(md5($i.NONCE_UNIQUE_KEY),-12,10);
}
function nonce_is_valid($nonce){
if (nonce_create()==$nonce || nonce_create(time()-NONCE_DURATION)==$nonce)
return true;
return false;
}
Run Code Online (Sandbox Code Playgroud)
另外,我对原始库有两个问题:
NONCE_UNIQUE_KEY?作者是否完全忘了?$i = ceil( time() / ( FT_NONCE_DURATION / 2 ) );它只有一半的时间(我试过)这会产生一个随机数,但它不是加密随机数。该库产生的值绝不能用于安全性,因为它严重依赖于时间的使用。攻击者知道当前时间,并且知道您的服务器时间,因为它位于 http 响应标头中。而且 md5() 的 prng 输出并不像应有的那样随机。md5 有许多已知的漏洞,为了安全起见,永远不应该使用它。而且 10 个字节的 base 16 相当小,16 个字节的 base256 将是理想的。
如果您需要一个相当难以猜测的唯一值,那么这在大多数情况下都有效:
sha1(uniqeid(mt_rand(),true));
然而,这并不理想。输出是base16,这非常浪费空间。uniqeid() 仍然使用时间,但是结果值中还有其他熵来源。
到目前为止, Web 应用程序的最佳熵源是/dev/urandom并使用fopen()它来访问它并读出 16 字节的 base256 内容。/dev/urandom 是一个熵存储,它从操作系统、其硬件以及系统上所有应用程序的行为收集随机源。