有人可以伪造 PHP 会话变量吗

信息安全 验证 php
2021-08-15 11:14:07

我有一个网站,用户可以在其中创建帐户并登录。当用户登录时,在验证用户的密码和用户名后,我给他们一个包含用户名的 PHP 会话变量。这就是他们访问我网站上的功能的方式,例如创建博客文章和更改他们的用户简介。

想通过另一个人的帐户访问我的网站的人可以伪造一个包含用户用户名的会话变量吗?如果是这样,他们怎么能做到这一点?有什么方法可以防止这种情况发生吗?

2个回答

不会。会话数据存储在服务器上。

会话 ID 是在客户端和服务器之间来回传输的唯一内容。因此,除非服务器被黑客入侵或存在服务器端错误,否则客户端无法直接更改会话数据。在您的情况下,会话变量中的用户名似乎是会话 ID 的一部分或它的替换(这有点不清楚)。

这并不意味着系统不必确保只有有效的客户端知道会话 ID,因为这就是将客户端链接到特定会话的原因。这就是session_regenerate_id()每次执行登录尝试时都必须使用该功能的原因。这可以防止会话固定

登录成功后发出的 PHP sessionid 是在服务器端生成的,只包含随机数据。sessionid 作为 cookie 发送,并包含在来自客户端的每个后续请求中。

会话数据存储在服务器上,会话 id 用于为每个请求引用此数据。PHP sessionid 被认为是安全的。

情况并非总是如此。在以前的 PHP 版本中,会话 id 是随机的,但随机生成器仅由服务器当前时间、远程地址和进程 id 播种。一旦攻击者能够弄清楚随机生成器的状态,她就可以预测之前和未来的会话 ID。http://seclists.org/fulldisclosure/2010/Mar/519

这使得攻击者可以窃取其他用户的会话。

从那以后发生的事情是,PHP 除了旧的弱代之外,它还从一个好的随机源(例如 linux 系统上的 /dev/urandom)获取 32 个字节。