PHP会话劫持

我有一个关于PHP会话劫持的问题。 我今天早上一直在读这个,我有几个问题,在我阅读的文档中没有清楚地回答。

用户可以在我的网站上更改他们的会话吗? 即如果他们在login时拥有X会话,他们是否可以将该会话更改为Y或Z,如果他们这样select的话?

我以为会议是由浏览器设置的,他们不能改变,但是这个会话劫持我一直在读的东西,在我的脑海里有一些怀疑。

术语“会话”被重载意味着在服务器和浏览器上的不同事物。 浏览器会话充其量只是连接到服务器会话。 “会话劫持”是指服务器会话 。

在服务器端,会话有一个ID(在客户端和服务器之间传递),内容(存储在服务器上)以及潜在的其他属性,比如上次访问时间。 会话ID通常作为cookie传递。 在PHP中,Cookie的默认名称是“PHPSESSID”。 如果cookie不可用,PHP将(可选)使用同名(“PHPSESSID”)的查询string参数。 这个cookie(或查询参数)很容易被改变,因此会话标识符也可以被改变。

会话的内容 (即包含用户的login状态)不能被客户端更改,数据存储在服务器上,只能通过该服务器上的PHP脚本进行更改。 请注意,在共享宿主环境(由其他服务或用户共享)中,如果使用默认会话存储目录( /tmp ),则会话可能会被覆盖。 为了防止这种情况发生,可以通过session_set_save_handler()来使用数据库,或者使用session.save_path设置一个自定义的会话目录(最好是700,这意味着只有拥有者(PHP用户)可以读写) 。

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

客户端,“会话”再次被重载,并在各种上下文中使用(例如,会话pipe理器,当浏览器打开,会话cookie和sessionStorage时恢复打开的页面)。 我们可以通过说浏览器会话包含一系列视图及其相关数据来尝试将这些含义(并非标准的意思)结合起来。 (通过“查看”我的意思是选项卡式浏览器和非标签式浏览器中的window大概选项卡; DOM window对象公开JS的视图。)每个视图都有历史logging,当前页面和页面数据。 会话中的视图共享同一个域中的页面的页面数据; 如果两个页面在不同的域或不同的会话中,他们不共享数据。 退出浏览器会closures所有打开的会话,可能会保存部分会话(例如历史logging,当前页面, sessionStorage ),以便会话pipe理器可以重新打开它们。 会话cookie是在会话closures时被丢弃的cookie; 换句话说,会话cookie是不可持续的。 虽然会话cookie可以保存一个会话ID, 但这两个概念是正交的 (意义4;会话cookie可以容纳除会话ID以外的其他内容,并且会话ID可以存储在持久的cookie中)。

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

总之,浏览器会话确实是由浏览器设置的,尽pipe它为用户提供了各种控制浏览器会话的方法:创build新会话,通过浏览,保存和恢复会话来改变视图中的历史和当前页面。 用户甚至可以通过编辑保存在磁盘上的会话来更改会话数据,尽pipe这不是浏览器提供的function。 这与会话劫持没有任何关系。 服务器会话由服务器创build和pipe理,但用户可以(尝试)通过更改浏览器返回到服务器的会话ID来切换服务器会话,这是会话劫持的基础。

另见PHP Session Fixation /劫持 。

用户可以随时更改他的会话。 这只是存储在用户浏览器的cookie中的随机string,因此用户很容易对其进行更改。

由于会话的实际内容存储在服务器上,因此可以存储用户的IP地址,用户代理或类似信息,以便更难以窃取来自对方的会话,通过检查这些信息是否每次都匹配新的http请求。