3 回答
TA贡献1801条经验 获得超16个赞
术语“会话”被重载以表示服务器上和浏览器中的不同内容。浏览器会话最多只能与服务器会话紧密连接。“会话劫持”是指服务器会话。
在服务器端,会话具有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来切换服务器会话,这是会话劫持的基础。
- 3 回答
- 0 关注
- 416 浏览
添加回答
举报