将用户对象存储在cookie中是否安全?

时间:2009-11-23 14:45:26

标签: security cookies

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

6 个答案:

答案 0 :(得分:17)

您不能相信存储在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 :(得分:1)

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

答案 2 :(得分:0)

对于这种情况,我会说将用户ID存储在cookie中就是这样。然后,在首次加载页面时,只要用户停留在您的页面上,您就可以从数据库加载所需的所有内容并继续使用会话。

要测试页面是否第一次加载,我只是在会话中设置了一个bool(如果已加载)。如果bool不存在,则用户最初会加载它。

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

答案 3 :(得分:0)

仅存储会话ID!从来没有有意义的数据,如用户ID。想象一下,你有一个拥有10,000个用户的网站。有可能你至少有一个叫超人和蝙蝠侠的用户 - 如果你在cookie中撕掉一个用户名来访问你的会话信息 - 我可能会操纵那个cookie来将我的用户名中的存储信息更改为蝙蝠侠并获得访问权限蝙蝠侠的账号,如果他的会话还活着的话。如果你存储某种随机生成的会话ID - 我几乎不可能找出一个可以让另一个用户劫持那个会话的会话号。

答案 4 :(得分:0)

如果您使用Hmac之类的内容,则可以信任Cookie中的信息。用户仍然可以查看数据,但是您可以知道他们是否已经篡改了数据(例如,将用户名更改为其他人的用户名以尝试查看其他用户的数据)。如果您不希望他们看到数据,您还可以对要发送的数据进行symettrically加密。显然所有这些都有CPU开销,带宽开销越多,你就越多,但是做你要求的事情是完全合法的。

答案 5 :(得分:0)

@ ApoY2k - 我认为向下投票(不是我:)是因为你不能假设从cookie传递的用户名是你写给cookie的实际用户名。这就是他们建议使用sessionID的原因。使用sessionID你可以获得用户名,就像他说的只有20分钟或你设置的会话超时。 SessionID不会显示任何私人数据。在我找到这篇文章之前,我有同样的想法。