1

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

4

2 回答 2

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 > time()

于 2012-06-27T16:58:42.530 回答
2

不。

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

  • 不要在 cookie 中存储任何特定的内容(用户名/id/等)。使用随机生成的废话(令牌)。
    1. 在您的数据库中,您可以拥有一个令牌 <-> 用户映射
    2. 根据您的数据库检查令牌并在匹配时登录用户
    3. 销毁令牌(将其标记为“已使用”,也许稍后会被删除。无论您决定什么,令牌都不应该再工作了)。
  • 仅用于https传输 cookie、登录等。
  • 如果用户发送过时的令牌(即不在您的数据库中的令牌,或者已被标记为已使用的令牌),这意味着令牌可能已被泄露。对于经过身份验证的用户(甚至可能使用 ajax)的每个请求,将他们登录时使用的令牌(您可以将其存储在会话中)与过期令牌尝试列表进行比较。如果匹配,这意味着经过身份验证的用户很可能已经劫持了令牌。把他们踢出去。
于 2012-06-27T17:01:25.510 回答