2010-01-28 133 views
2

我目前正在開發一個使用PHP和MYSQL的網站。這是一個私人網站,因此必須允許使用電子郵件註冊。簡單來說,如果新用戶必須註冊,管理員必須進入系統並添加要註冊的電子郵件地址。安全令牌處理

我想要做的是在發生這種情況時創建一個令牌或傳遞值。

步驟如下:

  1. 管理員添加一個電子郵件系統
  2. 一個獨特的標記值創建(如1234567890)
  3. 令牌值然後被髮送到用戶的電子郵件
  4. 用戶登錄提供的鏈接並輸入他的電子郵件和令牌值
  5. 如果成功 - 允許用戶註冊
  6. 如果失敗! - 令牌被重新生成並再次發送到該電子郵件地址

我真正想知道的是創建令牌的最佳做法是什麼,以及我們如何確保每次註冊電子郵件時創建唯一令牌。

爲了進一步的安全性,我可以確保每個令牌只能活幾個小時。但是,這是否會阻止未經授權的訪問系統,或者這對保護我的網站是一個壞主意?

我創造一個獨特的令牌的想法:使用散列使用SALT這樣的結果無法預測或解密(與MD5問題)

任何幫助或朝正確方向邁出的鉛會greatfull算法。

回答

4

我喜歡這種爲PHP生成密碼安全的僞隨機數生成器或(CSPRNG)的方法。這是written by Scott

<?php 
    function crypto_rand_secure($min, $max) { 
     $range = $max - $min; 
     if ($range < 0) return $min; // not so random... 
     $log = log($range, 2); 
     $bytes = (int) ($log/8) + 1; // length in bytes 
     $bits = (int) $log + 1; // length in bits 
     $filter = (int) (1 << $bits) - 1; // set all lower bits to 1 
     do { 
      $rnd = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes))); 
      $rnd = $rnd & $filter; // discard irrelevant bits 
     } while ($rnd >= $range); 
     return $min + $rnd; 
} 

function getToken($length=32){ 
    $token = ""; 
    $codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    $codeAlphabet.= "abcdefghijklmnopqrstuvwxyz"; 
    $codeAlphabet.= ""; 
    for($i=0;$i<$length;$i++){ 
     $token .= $codeAlphabet[crypto_rand_secure(0,strlen($codeAlphabet))]; 
    } 
    return $token; 
} 
?> 

在增加超時方面,我建議採取這種照顧在數據庫中。添加一個名爲「registration_timeout」的列,然後使用mysql的addtime()函數將該列設置爲當前時間戳+然而您希望超時時間長。

另請注意,臨時電子郵件帳戶使用起來微不足道(http://www.mailinator.com,http://www.guerrillamail.com等),所以要求某人註冊電子郵件帳戶並不意味着什麼。更多用戶帳戶最終可能會在http://www.bugmenot.com

+0

謝謝老兄..給我一個見解。至於電子郵件去。他們正在使用允許的IP地址以任何方式進行控制,並且在加號網站上不公開使用。 – 2010-01-28 23:38:28

+1

您的算法不符合CSPRNG的要求。維基百科頁面CSRRNG提供了一個體面的需求解釋。 – 2011-05-11 13:36:43

+0

@fsb好的,它解決了OP的問題嗎? – rook 2011-05-11 16:52:24