PHP会话劫持

24

我有一个关于PHP中会话劫持的问题。今天早上我在阅读相关文档时,发现一些问题没有得到清晰的答复。

一个用户能否更改他们在我的网站上的会话?例如,如果他们登录时有一个X的会话,那么他们是否可以选择将该会话更改为Y或Z?

我原本认为会话是由浏览器设置的,不能被更改,但所有这些我阅读到的会话劫持的内容都让我有所怀疑。

3个回答

46

“Session”这个词在服务器和浏览器中的含义不同,浏览器会话最多只与服务器会话联系紧密。 “会话劫持”是指服务器会话

在服务器端,会话有一个ID(在客户端和服务器之间传递),内容(存储在服务器上)和其他属性,例如上次访问时间。会话ID通常作为cookie传递。在PHP中,cookie的默认名称是“PHPSESSID”。如果没有cookie,则PHP将(可选地)使用相同名称的查询字符串参数(“PHPSESSID”)。此cookie(或查询参数)可以轻松更改,因此会话标识符也可以更改。

会话内容(即包含用户登录状态的内容)无法由客户端更改,数据存储在服务器上,只能由该服务器上的PHP脚本更改。请注意,在共享托管环境(由其他服务或用户共享),如果使用默认会话存储目录(/tmp),则会话可能会被覆盖。为了防止这种情况发生,请使用session_set_save_handler()设置数据库或使用session.save_path设置自定义会话目录,并设置正确的目录权限(最好是700,这意味着仅所有者(PHP用户)可以读取和写入它)。

为了防止会话劫持,您必须有其他方法来识别用户与会话的关系。这可以是用户代理、IP地址或另一个cookie。前面提到的方法只是解决方法,最好的保护会话cookie不被窃取的方法是在会话涉及时使用HTTPS。不要忘记使用session_set_cookie_params()httponly标志设置为true
客户端,“会话”再次被重载并用于各种情况(例如,会话管理器,在打开浏览器时恢复打开的页面,会话 cookie 和 sessionStorage)。我们可以尝试将这些含义结合起来(并不是标准意义),即通过说浏览器会话由视图及其关联数据组成。 (“视图”大致指选项卡式浏览器中的选项卡和非选项卡式浏览器中的窗口;DOM window 对象将视图公开给 JS。)每个视图都有一个历史记录、当前页面和页面数据。同一域中的页面数据在会话中的视图之间共享;如果两个页面位于不同的域或不同的会话中,则它们不共享数据。退出浏览器会关闭所有已打开的会话,可能会保存部分会话(例如,历史记录、当前页面、sessionStorage),以便会话管理器可以重新打开它们。会话 cookie 是在会话关闭时丢弃的 cookie;换句话说,会话 cookie 是非持久性的。虽然会话 cookie 可能包含会话 ID,但这两个概念是正交的(第4个意义;会话 cookie 可以包含除会话 ID 以外的其他内容,而会话 ID 可以存储在持久性 cookie 中)。

不同浏览器对于同一集合中的两个不同视图的定义不同。例如,一个浏览器可能认为会话包括一个窗口内的所有选项卡;而单独的窗口则是单独的会话。IE8 允许用户通过“新建会话”菜单项创建新会话。否则,新窗口和选项卡将在同一会话中打开。隐私模式也会创建新会话。

总的来说,浏览器会话确实由浏览器设置,但它提供了各种控制浏览器会话的方式:创建新会话、通过浏览更改视图中的历史记录和当前页面、保存和恢复会话。用户甚至可以通过编辑磁盘上保存的会话来更改会话数据,但这不是浏览器提供的功能。所有这些都与会话劫持无关。服务器会话由服务器创建和管理,但用户可以(尝试)通过更改其浏览器传回服务器的会话 ID 来切换服务器会话,这是会话劫持的基础。

另请参见 PHP 会话固定/劫持


11
会话劫持是指窃取会话Cookie。这最容易在与其他计算机共享本地网络时实现,例如在星巴克。例如...一个使用会话Y的用户正在星巴克浏览詹姆斯的网站。我倾听他们的网络流量,一边啜饮拿铁咖啡,一边获取使用会话Y的Cookies,并设置我的浏览器使用它们。现在当我访问詹姆斯的网站时,詹姆斯的网站会认为我是使用会话Y的用户。唯一停止这种情况的方法是使用端到端的HTTPS。 - Chris
@Lekensteyn 改变SessionID后,用户能够访问受限区域吗? - binoculars
1
@binoculars 是的,尤其是如果没有其他机制来验证会话。例如:stackoverflow.com 使用 usr cookie 来识别您,该 cookie 的格式为 t=XXX&s=yyy。高声望用户可以访问管理工具(这将是您的“受限区域”)。如果有人成功截取了未加密的 HTTP 流量,则此会话 cookie 就会被轻松提取。由于此 ID 未绑定到 IP 地址,攻击者可以使用此 cookie 访问高声望用户的帐户。(我刚刚使用 curl -b 'usr=t=...' stackoverflow.com 尝试了一下) - Lekensteyn
@Lekensteyn 我明白了。我有一个PositiveSSL证书。这是否完全消除了这个线程? - binoculars
@双筒望远镜 系统的安全性取决于最薄弱的环节。即使您的网站使用https,当:(1)您忘记为会话cookie设置“httpOnly”标志(只需一个微不足道的请求即可揭示未加密的会话cookie),或者(2)您从不受信任的来源(包括未加密的HTTP上的您自己的网站)中包含脚本时,它仍然容易受到会话劫持攻击。这只是一些客户端漏洞,在服务器端,您必须考虑此答案中的要点,并且不要做愚蠢的事情,例如将会话ID附加到任意URL并重定向到它。 - Lekensteyn
显示剩余6条评论

5
一个用户可以随时更改他的会话。它只是一个存储在用户浏览器中的随机字符串,因此用户很容易更改它。
由于会话的实际内容存储在您的服务器上,您可以例如存储用户的IP地址、用户代理或类似信息,以使从彼此窃取会话变得更加困难,通过检查每次进行新的HTTP请求时是否仍然匹配此信息。

3
实际上,用户不能更改您网站上的实际会话值,但可以更改用于跟踪会话的会话ID。此会话ID通常以名为“PHPSESSID”的cookie的形式存储在客户端浏览器中,也称为会话cookie。当在站点上启动会话时,它将对应于该会话的唯一ID存储在相应的客户端浏览器中,以名为“PHPSESSID”的cookie的形式。因此,如果用户能够获取任何其他用户的PHPSESSID并将其替换为受害者的PHPSESSID,则会导致会话劫持。我这里使用的是PHP语境。

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