PHP 会话劫持
我有一个关于PHP中会话劫持的问题。我今天早上一直在阅读它,我有一些问题在我阅读的文档中没有得到明确回答。
用户可以更改他们在我的网站上的会话吗?也就是说,如果他们在登录时有X的会话,如果他们选择,他们是否可以将该会话更改为Y或Z?
我以为会话是由浏览器设置的,它们无法更改,但是我一直在阅读的所有会话劫持内容都使我产生了一些疑问。
我有一个关于PHP中会话劫持的问题。我今天早上一直在阅读它,我有一些问题在我阅读的文档中没有得到明确回答。
用户可以更改他们在我的网站上的会话吗?也就是说,如果他们在登录时有X的会话,如果他们选择,他们是否可以将该会话更改为Y或Z?
我以为会话是由浏览器设置的,它们无法更改,但是我一直在阅读的所有会话劫持内容都使我产生了一些疑问。
术语“会话”被重载为在服务器和浏览器中表示不同的东西。浏览器会话充其量只能勉强连接到服务器会话。“会话劫持”是指服务器会话。
服务器端,会话具有 ID(在客户端和服务器之间传递)、内容(存储在服务器上)以及可能的其他属性(如上次访问时间)。会话 ID 通常作为 Cookie 传递。在 PHP 中,Cookie 的默认名称是“PHPSESSID”。如果 Cookie 不可用,PHP 将(可选)使用同名的查询字符串参数(“PHPSESSID”)。此 Cookie(或查询参数)可以轻松更改,因此会话标识符也可以更改。
会话的内容(即包含用户的登录状态)不能由客户端更改,数据存储在服务器上,并且只能由该服务器上的PHP脚本更改。请注意,在共享宿主环境(由其他服务或用户共享)中,如果使用默认会话存储目录 (),则可以覆盖会话。为了防止这种情况,可以通过session_set_save_handler()
使用数据库,或者使用具有适当目录权限设置session.save_path
设置自定义会话目录(最好是700,这意味着只有所有者(PHP用户)可以读取和写入它)。/tmp
若要防止会话劫持,必须有其他方法根据会话标识用户。这可以是用户代理、IP 地址或其他 Cookie。前面提到的方法只是解决方法,防止会话cookie被盗的最佳方法是在涉及会话时使用HTTPS。不要忘记将标志设置为使用session_set_cookie_params()
httponly
true
客户端的“会话”再次过载并在各种上下文中使用(例如会话管理器,在打开浏览器时恢复打开的页面,会话cookie和会话存储
)。我们可以尝试将这些含义(绝不是标准含义)结合起来,方法是说浏览器会话由视图及其关联数据的集合组成。(通过“视图”,我大致是指选项卡式浏览器中的选项卡和非选项卡式浏览器中的窗口;DOM对象向JS公开视图。每个视图都有一个历史记录、当前页面和页面数据。同一域中页面的页面数据在会话中的视图之间共享;如果两个网页位于不同的网域或不同的会话中,则它们不会共享数据。退出浏览器将关闭所有打开的会话,可能会保存部分会话(例如历史记录,当前页面),以便会话管理器可以重新打开它们。会话 Cookie 是在会话关闭时被丢弃的 Cookie;换句话说,会话 Cookie 是非持久性的。虽然会话 Cookie 可以保存会话 ID,但这两个概念是正交的(意义 4;会话 Cookie 可以保存会话 ID 以外的内容,会话 ID 可以存储在持久性 Cookie 中)。window
sessionStorage
两个不同的视图是否在同一集合中取决于浏览器。例如,一个浏览器可能将会话视为由单个窗口中的所有选项卡组成;单独的窗口是单独的会话。IE8 允许用户通过“新建会话”菜单项创建新会话。否则,将在同一会话中打开新窗口和选项卡。隐私模式还会创建新会话。
总而言之,浏览器会话确实由浏览器设置,尽管它为用户提供了各种控制浏览器会话的方法:创建新会话,通过浏览,保存和还原会话来更改视图中的历史记录和当前页面。用户甚至可以通过编辑保存在磁盘上的会话来更改会话数据,尽管这不是浏览器提供的功能。所有这些都与会话劫持无关。服务器会话由服务器创建和管理,但用户可以(尝试)通过更改浏览器传回服务器的会话 ID 来切换服务器会话,这是会话劫持的基础。
另请参阅 PHP 会话固定/劫持。
用户可以随时更改其会话。它只是存储在用户浏览器的cookie中的随机字符串,因此用户更改它非常简单。
由于会话的实际内容存储在您的服务器上,例如,您可以通过检查每次发出新的http请求时此信息是否仍然匹配来存储用户的IP地址,用户代理或类似地址,以使其更难相互窃取会话。