2016-07-04 39 views
1

我有这样一个表:何时应该删除用户的登录Cookie?

// cookies 
+----+---------+-------------------+------------+ 
| id | user_id |  token  | expire | 
+----+---------+-------------------+------------+ 
| 1 | 32423 | dki3j4rf9u3e40... | 1467586386 | 
| 2 | 65734 | erhj5473fv34gv... | 1467586521 | 
| 3 | 32423 | 9b0u2ejfd43k4r... | 1467586619 | 
| 4 | 21432 | 8u34ijf34t43gf... | 1467586640 | 
+----+---------+-------------------+------------+ 

表上面存储所有登录的Cookie。每个用户可以在以上的表中有多行(每行用于一个设备)

好,有三种情况来我必须从该表中删除行:

  1. 用户退出(单列)
  2. 老行(单列)
  3. 用户更改其密码(所有行)

嗯,我有一个想法,我需要一些建议:当登录cookie存在,并没有行匹配数据库中,我从客户端浏览器中删除该cookie。这可以吗?或者我不应该那样做?

if (isset($_COOKIE['login'])) { 

    // db connection here 
    $stm = $db->prepare('SELECT id, name, lname, reputation, email, notification 
         FROM users WHERE cookie = ? LIMIT 1'); 
    $stm->execute(array($_COOKIE['login'])); 
    $num_rows = $stm->fetch(); 

    if ($num_rows) { 
     // all fine 
    } else { 
     unset($_COOKIE['login']); 
     setcookie('login', '', time() - 3600, '/'); 
    } 

} 

请关注这些行:

unset($_COOKIE['login']); 
setcookie('login', '', time() - 3600, '/'); 

嗯,我在做什么是正确的?

+0

对于cookie数组,您只有一个'key',因此用户只能拥有存储在该密钥中的一个值。因此只能保留最近存储的值,因为之前的所有值都可能被覆盖。 –

+0

@MarcB我在说当一个cookie存在但它的值与数据库不匹配时,那么这个cookie就没用了。也似乎有点怀疑..我为什么需要保持它? – Shafizadeh

回答

2

如果用户发送的cookie不在数据库中,那么您无法对其执行任何操作。你不知道它是一个有效的cookie还是伪造的。你不知道它属于哪个用户。

您可以安全地删除它。无论如何,它将被新的正确登录覆盖。

+0

嗯thx +1 ..我需要听到的。 – Shafizadeh