站点用户可以更改 cookie 或会话数据吗?

Posted

技术标签:

【中文标题】站点用户可以更改 cookie 或会话数据吗?【英文标题】:Can site users change cookie or session data? 【发布时间】:2014-06-20 09:11:00 【问题描述】:

在我的一些帖子中,当我将用户信息存储在 cookie 中时,所有的 cmets 和答案都会这样说,“......回答问题......但不要使用 COOKIES 来存储用户信息。它是不安全。”

在我的一个测试网站中,我存储了一个名为“user”的 cookie,它保存了登录用户的用户名以及一个会话变量。我知道这可能是个人信息,但网页上显示的是用户名,这真的很重要吗?

如果黑客可以进入我的网站以更改“用户”cookie 和会话的值,并在没有用户名的情况下登录某人的帐户,这将很重要。

这可能吗?如果有,怎么做?

另外,如果我需要更新我的安全性,我如何在没有 cookie 的情况下选择“保持登录”?

感谢您的帮助。

【问题讨论】:

Cookies 由用户控制。任何人都可以添加、删除或更改任何 cookie 的值。 使用跨站点脚本可以窃取 cookie。会话 cookie 仅存储会话 ID(无意义,其中没有实际的用户数据),会话变量及其值在您的网络服务器上。对于您的“让我登录”,请参见例如link 尝试 Google 无会话 cookie。 您还可以将会话数据保存在数据库中,这样您就可以在用户返回您的站点时恢复会话。这是一个教程:shiflett.org/articles/storing-sessions-in-a-database javascript webStorage 和$_SESSION 是您可能想要使用的两个替代方案。 $_SESSION['username']$_COOKIE['username'] 好得多,因为您可以相信您的用户不能直接更改 $_SESSION 数据。 【参考方案1】:

是的,Cookies 存储在客户端,可以修改

那么如何防止入侵者修改数据呢?我想为此介绍两种机制:

存储在Session中,通过Cookie访问

因为 Http 是一个无状态的协议,服务器会保存一个通常命名为 session_id 的 cookie,客户端会在每次请求时发送它。 通过这种机制,服务器可以找出正在请求的用户。

服务器可以将用户数据存储在所谓的会话变量中,并且可以仅在服务器中访问它们,而客户端不能修改它们。 p>

示例:

在服务器的会话存储(磁盘、数据库或内存)上:

27: ["username" => "foo"]
35: ["username" => "bar"]
95: ["username" => "fuzz"]

在每个客户端的 cookie 上:

客户 1:

"session_id" : 27

客户端 2:

"session_id" : 35

客户 3:

"session_id" : 95

这个方法有一个向下

每个数据都必须存储在服务器中,并且会占用服务器的空间。

存储在Cookie中,通过Key访问

另一种方法是将数据存储在用户 cookie 中,但在存储它们之前,使用 密钥加密它们。

由于它们是加密的并且客户端没有访问密钥,因此入侵者无法对数据进行任何有效的更改。

在这种方法中,您只需将加密密钥存储在服务器上。

它不会消耗服务器的空间(磁盘或内存)

向下 :因为每个数据都是在每个 http 请求中从客户端发送的。它消耗服务器的带宽

例如:Laravel 框架的 Cookie 是加密的。

【讨论】:

以上是关于站点用户可以更改 cookie 或会话数据吗?的主要内容,如果未能解决你的问题,请参考以下文章

session和cookie一览

cookie和session那些事

跨站点请求伪造

XSS跨站点脚本的介绍和代码防御

Spring Security 中会话 cookie 的同站点标志

当会话 cookie 在 Laravel 中过期时重新加载站点