2017-04-15 35 views
0

我正在創建'記住我'功能。我試圖閱讀許多不同的文檔和手冊,以確保它儘可能安全。我需要在我的Cookie中使用TOKEN和VERIFIER作爲「記住我」功能嗎?

正如你所看到的,我創建該驗證cookie時,我們在MySQL數據庫中查找並找到用戶ID登錄他們在$令牌。

我剛纔讀的另一篇文章,這表明我應該將一個RANDOM標記和一個SHA(384)的VERIFIER存儲到cookie中,然後使用它們在MySQL數據庫中查找它們。

我看不出如何變得比下面的實施更安全,就好像它們以某種方式具有令牌一樣,它們也將具有驗證器?

if ($remember == 1) { 
    $token = bin2hex(openssl_random_pseudo_bytes(16)); 
    // insert token into the mysql database 
    $stmt = $pdo->prepare("INSERT INTO tokens (token, userid) VALUES(:token, :userid)"); 
    $stmt->execute(array( 
     'token' => $token, 
     'userid' => $rRow->ID 
    )); 
    setcookie ("MCTOKEN", $token, time() + 2419200,'/', SITE_DOMAIN); 
} 

回答

0

試想一下,用戶的cookie被嗅探/被盜的情況:壞人會立即只是通過創建mctoken訪問用戶的帳戶,與聞值,在他的瀏覽器。

你需要以某種方式來確保這種情況。驗證值來自這裏。它將是一個包含數據的字符串,您可以在下次再次使用它。最簡單的例子是用戶代理+鹽。你可以想到別的東西。

在這種情況下,即使您同時具有令牌+驗證者,但驗證值與當前環境不匹配,您也是安全的,並且用戶不會登錄!

0

您可以將兩者都存儲在cookie中,並且如果驗證器在某種程度上是唯一的(可能驗證用戶代理或IP地址等),那麼即使某人成功竊取令牌,其環境可能與驗證不匹配。但是,在服務器端也有一個驗證器是個好主意,它將驗證與cookie中的不同。增加的安全性是這部分不會被盜。

0

感謝您的回覆,我想我現在明白了......我的更新代碼在下面......很明顯,當我驗證我需要使用與「當前」用戶代理相同的鹽以查看它們是否匹配...

if ($remember == 1) { 

      $token = bin2hex(openssl_random_pseudo_bytes(18)); 
      $salt = '#$RaNdSa48Lf:f'; 
      $series = hash('sha256', $_SERVER['HTTP_USER_AGENT'] . $salt); 

      $expire = time() + 314496000; 

      // insert token and series into the database 
      $stmt = $pdo->prepare("INSERT INTO tokens (series, token, userid, expire) VALUES(:series, :token, :userid, :expire)"); 
      $stmt->execute(array( 
         'series' => $series, 
         'token'  => $token, 
         'userid' => $rRow->ID, 
         'expire' => $expire 
       )); 

      setcookie ("MCTOKEN", $token .':'. $series, $expire, '/', SITE_DOMAIN); 

     } 
+0

在您的新實現中'系列'不會從安全角度增加任何價值。 – zerkms