PHP会话劫持

时间:2011-06-26 09:14:58

标签: php session

我对PHP中的会话劫持有疑问。我今天早上一直在阅读这篇文章,并且在我阅读的文档中有一些问题没有得到清楚解答。

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

我认为这些会话是由浏览器设置的,并且无法更改,但所有这些会话劫持我一直在阅读的内容都让我产生了一些疑问。

3 个答案:

答案 0 :(得分:39)

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

服务器端,会话具有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的最佳方法。不要忘记使用session_set_cookie_params()

httponly标记设置为true

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

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

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

另见PHP Session Fixation / Hijacking

答案 1 :(得分:3)

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

由于会话的实际内容存储在您的服务器上,您可以存储用户的IP地址,用户代理或类似内容,以便通过检查此信息是否仍然匹配每次更难以相互窃取会话一个新的http请求。

答案 2 :(得分:0)

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