【问题标题】:Is it safe to store user object in a cookie?将用户对象存储在 cookie 中是否安全?
【发布时间】:2010-12-19 12:09:39
【问题描述】:

我有一个用户对象,其中包含有关用户的信息(用户名、IP、国家、姓名、电子邮件......但不是密码)。 我应该只将用户名存储在 cookie 中,然后在加载页面时从数据库中检索所有信息,还是只将整个 User 对象存储在 cookie 中?

【问题讨论】:

    标签: security cookies


    【解决方案1】:

    您不能信任存储在 cookie 中的任何信息,因为用户可以在闲暇时对其进行操作。

    我建议使用 PHP session 来存储对象。这样,最终用户只有一个存储在 cookie 中的会话 ID,以及您服务器上的真实数据。

    会话最终会超时,但是...强制用户重新登录。

    编辑:哎呀,我应该指出会话真的很容易使用。只需执行以下操作:

    session_start(); // This MUST be at the very top of every page that accesses the session
    
    // Store something in the session with the key 'something'
    $_SESSION['something'] = "Hi, I'm a session!"; 
    
    // Retrieve 'something' from the session
    $myString = $_SESSION['something'];
    

    【讨论】:

    • +1 表示“您不能信任 cookie 中的数据。”为了扩展 R. Bemrose 的观点,cookie 应该包含指向系统中数据的指针,仅此而已。这样,cookie 数据本身就毫无意义。
    • 此外,在 cookie 中传递大量数据可能会对页面加载时间产生不利影响,因为每次请求都会传递 cookie。
    • 或者,它可能对页面加载时间产生积极影响,因为它允许您消除数据库往返。你只有通过测量才能知道。 :)
    • @Thom:假设您正在回复 Yacoby;您将节省数据库往返行程,代价是向您的服务器发送每个请求的 cookie。一个会话巧妙地消除了这两个问题。
    • @R.Bemrose: 这是以每次请求都会访问会话存储为代价的——我怀疑在 PHP 的默认设置中,这意味着读取和写入文件,因此您需要额外的磁盘 IO担心。我要说的只是将内容存储在 cookie 中是一件有效的事情,如果它让你的船浮起来的话,你做出的任何关于性能的决定都应该基于你测量过的东西,而不是你做出的假设。 :)
    【解决方案2】:

    对于这种情况,我会说将用户 ID 存储在 cookie 中,仅此而已。然后,在第一次加载页面时,您从数据库中加载所需的所有内容并继续使用会话,只要用户留在您的页面上。

    为了测试页面是否第一次加载,我只是在会话中设置了一个布尔值,如果它已经加载。如果 bool 不存在,您的用户会首先加载它。

    可能有更好的方法来做到这一点,但它工作得很好而且很容易。 :)

    【讨论】:

      【解决方案3】:

      “从不信任发布的数据”的标准规则也适用于 cookie。我建议只存储用户 ID 以及 ID 的哈希值和一些只有服务器知道的秘密。

      【讨论】:

        【解决方案4】:

        只存储一个会话 ID!永远不要有意义的数据,例如用户 ID。假设您有一个拥有 10,000 名用户的网站。很有可能您至少有一个名为 superman 和 batman 的用户 - 如果您在 cookie 中撕毁用户名以访问您的会话信息 - 我可以操纵该 cookie 将存储的信息从我的用户名更改为 batman 并获得访问权限如果他的会话仍然存在,则记入蝙蝠侠的帐户。如果您存储某种随机生成的会话 id - 我几乎不可能找出可以让其他用户劫持该会话的会话编号。

        【讨论】:

          【解决方案5】:

          如果您使用 Hmac 之类的内容,您可以信任 cookie 中的信息。用户仍然可以看到数据,但您会知道他们是否篡改了数据(例如,将用户名更改为其他人的用户名以试图查看其他用户的数据)。如果您不希望他们看到数据,您也可以对您发送的数据进行对称加密。显然,所有这些都会产生 CPU 开销,而且你塞进去的东西越多,带宽开销就会越大,但按照你的要求去做是完全合法的。

          【讨论】:

            【解决方案6】:

            @ApoY2k - 我认为否决票(不是我 :) 是因为您不能假设从 cookie 传递的用户名是您写入 cookie 的实际用户名。这就是为什么他们建议使用 sessionID。使用 sessionID 你可以去获取用户名,就像他说的那样,只有 20 分钟或者你设置会话超时的任何时间。 SessionID 不会泄露任何私人数据。不过,在我找到这篇文章之前,我也有过你的想法。

            【讨论】:

              猜你喜欢
              • 2016-05-07
              • 2011-01-07
              • 1970-01-01
              • 2021-07-15
              • 1970-01-01
              • 1970-01-01
              • 2020-12-20
              • 2011-07-11
              • 2012-05-06
              相关资源
              最近更新 更多