我有一个关于PHP中会话劫持的问题。今天早上我在阅读相关文档时,发现一些问题没有得到清晰的答复。
一个用户能否更改他们在我的网站上的会话?例如,如果他们登录时有一个X的会话,那么他们是否可以选择将该会话更改为Y或Z?
我原本认为会话是由浏览器设置的,不能被更改,但所有这些我阅读到的会话劫持的内容都让我有所怀疑。
“Session”这个词在服务器和浏览器中的含义不同,浏览器会话最多只与服务器会话联系紧密。 “会话劫持”是指服务器会话。
在服务器端,会话有一个ID(在客户端和服务器之间传递),内容(存储在服务器上)和其他属性,例如上次访问时间。会话ID通常作为cookie传递。在PHP中,cookie的默认名称是“PHPSESSID”。如果没有cookie,则PHP将(可选地)使用相同名称的查询字符串参数(“PHPSESSID”)。此cookie(或查询参数)可以轻松更改,因此会话标识符也可以更改。
会话内容(即包含用户登录状态的内容)无法由客户端更改,数据存储在服务器上,只能由该服务器上的PHP脚本更改。请注意,在共享托管环境(由其他服务或用户共享),如果使用默认会话存储目录(/tmp
),则会话可能会被覆盖。为了防止这种情况发生,请使用session_set_save_handler()
设置数据库或使用session.save_path
设置自定义会话目录,并设置正确的目录权限(最好是700,这意味着仅所有者(PHP用户)可以读取和写入它)。
session_set_cookie_params()
将httponly
标志设置为true
。sessionStorage
)。我们可以尝试将这些含义结合起来(并不是标准意义),即通过说浏览器会话由视图及其关联数据组成。 (“视图”大致指选项卡式浏览器中的选项卡和非选项卡式浏览器中的窗口;DOM window
对象将视图公开给 JS。)每个视图都有一个历史记录、当前页面和页面数据。同一域中的页面数据在会话中的视图之间共享;如果两个页面位于不同的域或不同的会话中,则它们不共享数据。退出浏览器会关闭所有已打开的会话,可能会保存部分会话(例如,历史记录、当前页面、sessionStorage
),以便会话管理器可以重新打开它们。会话 cookie 是在会话关闭时丢弃的 cookie;换句话说,会话 cookie 是非持久性的。虽然会话 cookie 可能包含会话 ID,但这两个概念是正交的(第4个意义;会话 cookie 可以包含除会话 ID 以外的其他内容,而会话 ID 可以存储在持久性 cookie 中)。
不同浏览器对于同一集合中的两个不同视图的定义不同。例如,一个浏览器可能认为会话包括一个窗口内的所有选项卡;而单独的窗口则是单独的会话。IE8 允许用户通过“新建会话”菜单项创建新会话。否则,新窗口和选项卡将在同一会话中打开。隐私模式也会创建新会话。
总的来说,浏览器会话确实由浏览器设置,但它提供了各种控制浏览器会话的方式:创建新会话、通过浏览更改视图中的历史记录和当前页面、保存和恢复会话。用户甚至可以通过编辑磁盘上保存的会话来更改会话数据,但这不是浏览器提供的功能。所有这些都与会话劫持无关。服务器会话由服务器创建和管理,但用户可以(尝试)通过更改其浏览器传回服务器的会话 ID 来切换服务器会话,这是会话劫持的基础。
另请参见 PHP 会话固定/劫持。
usr
cookie 来识别您,该 cookie 的格式为t=XXX&s=yyy
。高声望用户可以访问管理工具(这将是您的“受限区域”)。如果有人成功截取了未加密的 HTTP 流量,则此会话 cookie 就会被轻松提取。由于此 ID 未绑定到 IP 地址,攻击者可以使用此 cookie 访问高声望用户的帐户。(我刚刚使用curl -b 'usr=t=...' stackoverflow.com
尝试了一下) - Lekensteyn