PHP会话劫持

Jam*_*mes 19 php session

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

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

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

Lek*_*eyn 39

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

在服务器端,会话具有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来切换服务器会话,这是会话劫持的基础.

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

  • 会话劫持是指窃取会话cookie.与其他计算机共享本地网络时,这可以很容易地实现.比如星巴克.示例...会话Y的用户正在星巴克浏览James的网站.我在听他们的网络流量,喝着我的拿铁咖啡.我为詹姆斯的网站带来了会话Y的cookie,并设置我的浏览器使用它们.现在当我访问James的网站时,James的网站认为我是会话Y的用户.阻止这种情况的唯一方法是使用端到端的https. (11认同)

Dec*_*cko 5

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

由于会话的实际内容存储在您的服务器上,因此您可以存储用户的 IP 地址、用户代理或类似内容,通过检查每次新的 http 时此信息是否仍然匹配,使彼此窃取会话变得更加困难提出请求。