我有一个关于PHP中会话劫持的问题。我今天早上一直在阅读有关它的信息,我有一些问题在我阅读的文档中并未得到明确回答。
用户可以更改他们在我的网站上的会话吗?例如,如果他们在登录时拥有X会话,是否可以选择将该会话更改为Y或Z?
我以为会话是由浏览器设置的,因此无法更改,但是我一直在阅读的所有会话劫持资料都使我有些怀疑。
术语“会话”被重载以表示服务器上和浏览器中的不同内容。浏览器会话最多只能与服务器会话紧密连接。“会话劫持”是指服务器会话。
在服务器端,会话具有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允许用户通过“新会话”菜单项创建新会话。否则,将在同一会话中打开新的窗口和选项卡。隐私html" target="_blank">模式还会创建新的会话。
总而言之,浏览器会话确实是由浏览器设置的,尽管它为用户提供了多种控制浏览器会话的方式:创建新会话,通过浏览,保存和还原会话来更改视图中的历史记录和当前页面。用户甚至可以通过编辑保存在磁盘上的会话来更改会话数据,尽管这不是浏览器提供的功能。这些都与会话劫持无关。服务器会话是由服务器创建和管理的,但是用户可以(尝试)通过更改其浏览器传回服务器的会话ID来切换服务器会话,这是会话劫持的基础。
问题内容: 让我们只考虑服务器对用户的信任。 会话固定:为了避免固定,我仅在身份验证中使用(login.php) 会话劫持:整个站点的SSL加密。 我安全吗? 问题答案: 阅读OWASP A3-Broken AuthenticationandSessionManagement。另请阅读有关OWASPA5-CSRF的信息,有时也称为“会话骑行”。 您应该在php标头文件中使用以下代码: 此代码可防止
4.4. 会话劫持 最常见的针对会话的攻击手段是会话劫持。它是所有攻击者可以用来访问其它人的会话的手段的总称。所有这些手段的第一步都是取得一个合法的会话标识来伪装成合法用户,因此保证会话标识不被泄露非常重要。前面几节中关于会话暴露和固定的知识能帮助你保证会话标识只有服务器及合法用户才能知道。 深度防范原则(见第一章)可以用在会话上,当会话标识不幸被攻击者知道的情况下,一些不起眼的安全措施也会提供一
问题内容: 如何防止多个客户端使用相同的会话ID?我之所以这样询问,是因为我想增加一层安全保护,以防止网站上的会话劫持。如果黑客以某种方式弄清楚另一个用户的会话ID并使用该SID发出请求,我如何检测到服务器上有不同的客户端共享一个SID,然后拒绝劫持尝试? 编辑 经过深思熟虑后,我接受了Gumbo的回答,因为我意识到由于 无状态HTTP协议 的限制,我所要求的是不可能的。我忘了HTTP的最基本原理
问题内容: 我知道这个话题已经讨论 了很多 ,但是我还有一些具体问题仍未得到解答。例如: 所以,我的问题是 做的提供足够的安全性? 可以保存用户的IP和导航器,然后在每次加载页面时进行检查以检测会话劫持吗?这有什么问题吗? 使用正确吗? 使用正确吗? 问题答案: 您的配置很棒。您肯定阅读了如何锁定php会话。但是,此行代码会抵消您的php配置提供的许多保护: 这是一种生成会话ID 的 特别糟糕的
问题内容: 我在用户登录时创建会话,如下所示: 如何在X分钟的会话上指定超时,然后在达到X分钟后让它执行功能或页面重定向? 编辑:我忘了提及由于不活动,我需要会话超时。 问题答案: 首先,存储用户最后一次发出请求的时间 在后续请求中,检查他们多久之前提出了请求(在此示例中为10分钟)
问题内容: 已锁定 。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 用PHP维护负责的会话安全性有哪些准则?网络上到处都有信息,现在是时候将它们全部集中在一个地方了! 问题答案: 为了确保会话安全,需要执行以下几项操作: 对用户进行身份验证或执行敏感操作时,请使用SSL。 只要安全级别发生更改(例如登录),就重新生成会话ID。如果愿意,您甚至可以为每个请求