【发布时间】:2010-12-19 12:09:39
【问题描述】:
我有一个用户对象,其中包含有关用户的信息(用户名、IP、国家、姓名、电子邮件......但不是密码)。 我应该只将用户名存储在 cookie 中,然后在加载页面时从数据库中检索所有信息,还是只将整个 User 对象存储在 cookie 中?
【问题讨论】:
我有一个用户对象,其中包含有关用户的信息(用户名、IP、国家、姓名、电子邮件......但不是密码)。 我应该只将用户名存储在 cookie 中,然后在加载页面时从数据库中检索所有信息,还是只将整个 User 对象存储在 cookie 中?
【问题讨论】:
您不能信任存储在 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'];
【讨论】:
对于这种情况,我会说将用户 ID 存储在 cookie 中,仅此而已。然后,在第一次加载页面时,您从数据库中加载所需的所有内容并继续使用会话,只要用户留在您的页面上。
为了测试页面是否第一次加载,我只是在会话中设置了一个布尔值,如果它已经加载。如果 bool 不存在,您的用户会首先加载它。
可能有更好的方法来做到这一点,但它工作得很好而且很容易。 :)
【讨论】:
“从不信任发布的数据”的标准规则也适用于 cookie。我建议只存储用户 ID 以及 ID 的哈希值和一些只有服务器知道的秘密。
【讨论】:
只存储一个会话 ID!永远不要有意义的数据,例如用户 ID。假设您有一个拥有 10,000 名用户的网站。很有可能您至少有一个名为 superman 和 batman 的用户 - 如果您在 cookie 中撕毁用户名以访问您的会话信息 - 我可以操纵该 cookie 将存储的信息从我的用户名更改为 batman 并获得访问权限如果他的会话仍然存在,则记入蝙蝠侠的帐户。如果您存储某种随机生成的会话 id - 我几乎不可能找出可以让其他用户劫持该会话的会话编号。
【讨论】:
如果您使用 Hmac 之类的内容,您可以信任 cookie 中的信息。用户仍然可以看到数据,但您会知道他们是否篡改了数据(例如,将用户名更改为其他人的用户名以试图查看其他用户的数据)。如果您不希望他们看到数据,您也可以对您发送的数据进行对称加密。显然,所有这些都会产生 CPU 开销,而且你塞进去的东西越多,带宽开销就会越大,但按照你的要求去做是完全合法的。
【讨论】:
@ApoY2k - 我认为否决票(不是我 :) 是因为您不能假设从 cookie 传递的用户名是您写入 cookie 的实际用户名。这就是为什么他们建议使用 sessionID。使用 sessionID 你可以去获取用户名,就像他说的那样,只有 20 分钟或者你设置会话超时的任何时间。 SessionID 不会泄露任何私人数据。不过,在我找到这篇文章之前,我也有过你的想法。
【讨论】: