会话变量可以被欺骗(登录)吗?

6

在PHP中: 用户是否有办法伪造会话变量?

对于登录系统,信任会话变量的值是否安全?

4个回答

16

会话数据存储在服务器上,只有会话 ID 在客户端和服务器之间来回传递。除非服务器端脚本出现问题(或存在漏洞),否则客户端无法直接更改会话数据。但您必须确保只有“正确”的客户端知道会话 ID,因为它将此特定客户端与特定会话绑定在一起。例如(由于您提到了登录),在执行登录(尝试)时使用session_regenerate_id()以防止会话固定


7

会话被存储在您的服务器上,可以是文件或内存中。用户只持有一个cookie,该cookie定义了到您的服务器上会话数据的路径(通常是某种哈希值)。理论上,您可以将cookie更改为其他人的哈希值,但这非常不可能,除非您将它们存储为文件并在过期后不删除它们,否则旧会话被利用的可能性会增加。


非常、非常不可能的事情,当应用于数十亿次交易时,很容易变成值得极度关注的事情。当然,我不知道 OP 项目的规模如何,但这是需要考虑的事情。 - overslacked

4

是的,这被称为会话伪造/劫持。

您可以更改会话cookie的值,直到获得另一个用户的会话。


2
+1 指出会话劫持的问题,但我必须补充一点,它并不会改变服务器上的变量。它只是允许一个用户冒充另一个用户。这种安全/可能性取决于您的会话 ID 的复杂程度以及其有效期有多长。 - deceze
为了简单起见,假设我有以下代码:if($_SESSION['userName']=="admin) { //仅管理员可使用内容 } else { //其他用户可使用内容 } 这种方法能够伪造/劫持userName会话变量吗? 为什么没有人谈论这个问题? - The Disintegrator
哇,谷歌搜索“session forge/hijack”将此页面作为第一个结果返回。我写下这个问题后33分钟! - The Disintegrator
@animuson,我所说的是在这个范围之外的。每当我看到任何关于会话的文章时,都没有提到会话劫持。 在信任系统的安全性之前进行事实核查是不好吗? - The Disintegrator
-1 这不是真正的攻击。正常的会话 ID 非常大,需要进行数万亿次请求才能获取到另一个有效的会话。 - rook
显示剩余2条评论

0
为了避免在服务器中存储会话数据,您可以在将其存储到会话之前对要保护的内容进行签名,然后在从会话中检索后进行验证。在PHP中,这个过程相当简单,并且消除了服务器存储问题。
请注意,这并不能保护会话数据不被可视化。如果您需要此保护,仍然可以通过使用安全加密来避免服务器存储。只需注意,基于密钥大小的几乎所有加密方案都可能在不久的将来被破解。因此,如果您需要保护会话数据,比如说5年,选择安全的密钥和算法可能会创建性能问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接