[英]How can I improve this NONCE library for PHP?
這是我第一次使用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;
}
另外,我對原始庫有兩個問題:
NONCE_UNIQUE_KEY
? 作者是否完全忘了? $i = ceil( time() / ( FT_NONCE_DURATION / 2 ) );
,它只有一半的時間工作(我嘗試過) 這會產生一個Nonce,但它不是一個加密的nonce。 此庫生成的值絕不能用於安全性,因為它嚴重依賴於時間的使用。 攻擊者知道當前時間,並且知道您的服務器時間,因為它在http響應頭中。 另外md5()的prng輸出並不像應該的那樣隨機。 針對md5存在許多已知漏洞,並且絕不應該將其用於安全性。 另外10個字節的基本16非常小,16個字節的base256將是理想的。
如果您需要一個難以猜測的獨特值,那么在大多數情況下這將起作用:
sha1(uniqeid(mt_rand(),true));
但是,這不太理想。 輸出是base16,非常浪費空間。 uniqeid()仍然使用時間,但結果值中還有其他熵源。
到目前為止, Web應用程序的最佳熵源是/dev/urandom
並使用fopen()
來訪問它並讀出16個字節的base256內容。 / dev / urandom是一個熵存儲,它從操作系統,其硬件和系統上所有應用程序的行為中收集隨機源。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.