在Cookie中保存用户信息

时间:2012-06-27 16:55:06

标签: php mysql

当用户选择记住我的功能时,我将他的用户名和ID保存在cookie中。然后,当用户返回到站点时,我会检查数据库的用户名和ID,以确保用户是合法的。我接下来通过将cookie数据存储在会话变量中来登录用户。这是记住和登录用户的正确方法吗?

2 个答案:

答案 0 :(得分:3)

Cookie不是一种非常安全的数据存储方式。 Cookie可以由用户修改,并可能导致某人“入侵”您的网站。我建议的是在cookie中存储一个字符串,它是某些东西的哈希值。还要在数据库中存储cookie中的散列字符串。这样,当用户返回到站点时,您检查cookie是否已填充,将其与数据库中的哈希值匹配,然后查找谁拥有该哈希值。如果全部有效,请将其登录。

数据库设置

secretKey PK varchar
userid (could be unique) int
validUntil int or date/time
  //If userID is unique you will have to remove this row from the 
  // database when a new key is made for the user,  This would then mean
  // that a user would only be allowed to be rememberd on one computer

<强>伪代码

//User logs in with remember me
    //set cookie to something like md5(userid,username,timestamp)
    //store the md5 in the database layout
//User Returns to site
    //check to see if cookie is set
        //if cookie set
            //find md5 in database which is logged with user id
            //if found and not yet expired log in
            //else show login page
        //if cookie not set show login page

在有效的直到字段中,您可以将其设置为在登录后2周。一旦有效直到过去,不要让该密钥工作,并确保用户的cookie已过期。

查询以检查登录信息

SELECT * FROM rememberMe WHERE key =“// put md5 here”AND validUntil&gt;时间()

答案 1 :(得分:2)

没有

这取决于你想要获得的安全性。以下是您可以做的一些事情(部分或全部)以提高安全性:

  • 不要存储cookie中的特定内容(用户名/ id /等)。使用随机生成的废话(令牌)。
    1. 在您的数据库中,您可以拥有一个令牌&lt; - &gt;用户映射
    2. 根据您的数据库检查令牌,并在匹配时将用户登录
    3. 销毁令牌(将其标记为“已消耗”,以后可能会被删除。无论你决定什么,令牌都不应再起作用了。)
  • 仅使用https传输Cookie,登录等
  • 如果用户发送过时令牌(即不在您的数据库中或已被标记为已消耗的令牌),则表示该令牌可能已被泄露。在每个对经过身份验证的用户(甚至可能使用ajax)的请求中,将他们登录的令牌(您可以将其存储在会话中)与过时令牌尝试列表进行比较。如果匹配,这意味着经过身份验证的用户可能已经劫持了令牌。把它们踢出去。