一尘不染

PHP会话劫持

php

我有一个关于PHP中会话劫持的问题。我今天早上一直在阅读有关它的信息,我有一些问题在我阅读的文档中并未得到明确回答。

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

我以为会话是由浏览器设置的,因此无法更改,但是我一直在阅读的所有会话劫持资料都使我有些怀疑。


阅读 278

收藏
2020-05-26

共1个答案

一尘不染

术语“会话”被重载以表示服务器上和浏览器中的不同内容。浏览器会话最多只能与服务器会话紧密连接。“会话劫持”是指服务器会话。

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

会话的 内容
(即包含用户的登录状态)不能由客户端更改,数据存储在服务器上,只能由该服务器上的PHP脚本更改。请注意,在共享主机环境(由其他服务或用户共享)中,如果使用默认会话存储目录(/tmp),则可以覆盖会话。为了防止这种情况,要么使用数据库,要么使用具有适当目录权限session_set_save_handler()集的自定义会话目录session.save_path(最好设置为700,这意味着只有所有者(PHP用户)才能对其进行读写)。

为了防止会话劫持,您必须具有其他方法可以根据会话识别用户。这可以是用户代理,IP地址或其他cookie。前面提到的方法只是解决方法,如果涉及到会话,则最好使用HTTPS来防止会话cookie的窃取。不要忘记将httponly标志设置为true使用session_set_cookie_params()

在客户端,“会话”再次超载并在各种上下文中使用(例如,会话管理器,当打开浏览器时会恢复打开的页面,会话cookie和sessionStorage。我们可以说浏览器会话由视图及其相关数据的集合组成,以尝试将这些含义组合在一起(绝不是标准的含义)。(通过“视图”,我指的是带标签的浏览器中的选项卡,而非带标签的浏览器中的窗口;
DOM
window对象将视图公开给JS。)每个视图都有一个历史记录,一个当前页面和页面数据。会话中的视图之间共享同一域中页面的页面数据;如果两个页面位于不同的域或不同的会话中,则它们不共享数据。退出浏览器会关闭所有打开的会话,可能会保存部分会话(例如历史记录,当前页面,sessionStorage),以便会话管理器可以重新打开它们。会话cookie是在会话关闭时被丢弃的cookie。换句话说,会话cookie是非持久性的。尽管会话cookie可以保存会话ID,但是这两个概念是正交的(意义4;会话cookie可以保存会话ID以外的内容,并且可以将会话ID存储在持久性cookie中)。

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

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

2020-05-26