PHP会话劫持


PHP Session Hijacking

我有一个关于PHP中会话劫持的问题。今天早上我一直在读这篇文章,我有一些问题在我读到的文档中没有得到明确的回答。

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

我以为会话是由浏览器设置的,不能更改,但我读到的所有这些劫持会话的东西都让我产生了一些疑问。

术语"会话"在服务器和浏览器中的含义不同。浏览器会话最多只能微弱地连接到服务器会话。"会话劫持"指的是服务器会话。

在服务器端,会话具有ID(在客户端和服务器之间传递)、内容(存储在服务器上)和潜在的其他属性,例如上次访问时间。会话ID通常作为cookie传递。在PHP中,cookie的默认名称是"PHPSSID"。如果cookie不可用,PHP将(可选)使用相同名称的查询字符串参数("PHPSSID")。这个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会话固定/劫持。

用户可以随时更改会话。这只是一个随机字符串,存储在用户浏览器的cookie中,因此用户更改它非常简单

由于会话的实际内容存储在服务器上,例如,您可以存储用户的ip地址、用户代理或类似信息,以便在每次发出新的http请求时检查这些信息是否仍然匹配,从而更难相互窃取会话。

实际上,用户不能更改您网站上的实际会话值,但可以更改用于跟踪会话的会话id。此会话id通过您的网站存储在客户端浏览器上,通常在cookie中命名为"PHPSSID",也称为会话cookie。当一个会话在一个站点上启动时,它会以名为"PHPSSID"的cookie的形式将对应于该会话的唯一id存储在相应的客户端浏览器中。因此,如果用户能够获得任何其他用户的PHPSSID,并且可以用受害者PHPSSID替换他的PHPSSSID,这将导致会话劫持。我在这里使用PHP上下文。