当前位置: 首页 > 面试题库 >

防止会话劫持

韩安顺
2023-03-14
问题内容

如何防止多个客户端使用相同的会话ID?我之所以这样询问,是因为我想增加一层安全保护,以防止网站上的会话劫持。如果黑客以某种方式弄清楚另一个用户的会话ID并使用该SID发出请求,我如何检测到服务器上有不同的客户端共享一个SID,然后拒绝劫持尝试?

编辑

经过深思熟虑后,我接受了Gumbo的回答,因为我意识到由于 无状态HTTP协议
的限制,我所要求的是不可能的。我忘了HTTP的最基本原理是什么,现在我想到这个问题似乎有点琐碎。

让我详细说明一下我的意思:

用户A登录example.com后,会为他提供一些随机会话ID,为简单起见,将其设为“
abc123”。该会话ID在客户端存储为cookie,并通过服务器端会话进行验证,以确保登录的用户在从一个网页移动到另一个网页时仍保持登录状态。如果HTTP不是无状态的,则此cookie当然不需要存在。因此,如果用户B窃取了用户A的SID,并在其计算机上创建了一个值为’abc123’的cookie,那么他本可以成功劫持用户A的会话,但是服务器根本无法合法地识别出用户B的会话。该请求与用户A的请求有任何不同,因此服务器没有理由拒绝任何请求。即使我们要列出服务器上已经处于活动状态的会话,并尝试查看某人是否正在访问已处于活动状态的会话,我们如何才能确定是另一个用户在非法访问该会话而不是同一用户谁已经使用会话ID登录,但只是尝试使用它发出另一个请求(即导航到另一个网页)。我们不能。检查用户代理?可以被欺骗-
但是作为深度防御措施还是不错的。IP地址?可以出于正当理由进行更改-
但我建议不要检查IP地址的前两个八位字节,而不必完全检查IP地址,因为即使是出于完全正当理由而不断更改IP的数据计划网络用户通常只具有其IP更改的最后两个八位位组。

最后,无状态HTTP谴责我们永远无法完全保护我们的网站免受会话劫持,但是良好的做法(如Gumbo提供的做法)将足以防止大多数会话攻击。因此,试图通过拒绝同一SID的多个请求来保护会话免遭劫持,这简直是荒谬的,并且会破坏会话的整个目的。


问题答案:

不幸的是,与真正的请求相反,没有有效的方法来明确地标识出源自攻击者的请求。因为大多数反措施检查的属性(例如IP地址或用户代理特征)要么都不可靠(IP地址可能在多个请求中更改),要么很容易伪造(例如
User-Agent 请求标头),因此可能会产生不必要的误报(即真正的用户切换IP地址)或否定否定(即攻击者能够使用相同的 User-Agent
成功伪造请求)。

这就是为什么防止会话劫持的最佳方法是确保攻击者无法找到其他用户的会话ID。这意味着您应该设计您的应用程序及其会话管理,以使(1)攻击者无法通过使用足够的熵来猜测有效的会话ID,以及(2)攻击者没有其他方法可以通过已知的攻击获得有效的会话ID。
/漏洞,例如嗅探网络通信,跨站点脚本,通过 Referer 泄漏等。

也就是说,您应该:

  • 使用足够的随机输入来生成会话ID(请参阅 session.entropy_filesession.entropy_lengthsession.hash_function
  • 在传输过程中使用HTTPS保护会话ID
  • 将会话ID存储在cookie中而不是URL中,以避免通过 Referer 泄漏(请参阅 session.use_only_cookies
  • 使用HttpOnlySecure属性设置cookie,以禁止通过JavaScript访问(如果存在XSS漏洞),并禁止通过不安全的通道进行传输(请参见 session.cookie_httponlysession.cookie_secure

除此之外,您还应该在某些会话状态更改(例如,登录后确认真实性或更改授权/特权)后使旧的ID(请参见session_regenerate_id函数)无效的同时重新生成会话ID,此外,您还可以定期执行此操作以减少时间跨度成功进行会话劫持攻击。



 类似资料:
  • 问题内容: 我知道这个话题已经讨论 了很多 ,但是我还有一些具体问题仍未得到解答。例如: 所以,我的问题是 做的提供足够的安全性? 可以保存用户的IP和导航器,然后在每次加载页面时进行检查以检测会话劫持吗?这有什么问题吗? 使用正确吗? 使用正确吗? 问题答案: 您的配置很棒。您肯定阅读了如何锁定php会话。但是,此行代码会抵消您的php配置提供的许多保护: 这是一种生成会话ID 的 特别糟糕的

  • 问题内容: 我有一个关于PHP中会话劫持的问题。我今天早上一直在阅读有关它的信息,我有一些问题在我阅读的文档中并未得到明确回答。 用户可以更改他们在我的网站上的会话吗?例如,如果他们在登录时拥有X会话,是否可以选择将该会话更改为Y或Z? 我以为会话是由浏览器设置的,因此无法更改,但是我一直在阅读的所有会话劫持资料都使我有些怀疑。 问题答案: 术语“会话”被重载以表示服务器上和浏览器中的不同内容。浏

  • 4.4. 会话劫持 最常见的针对会话的攻击手段是会话劫持。它是所有攻击者可以用来访问其它人的会话的手段的总称。所有这些手段的第一步都是取得一个合法的会话标识来伪装成合法用户,因此保证会话标识不被泄露非常重要。前面几节中关于会话暴露和固定的知识能帮助你保证会话标识只有服务器及合法用户才能知道。 深度防范原则(见第一章)可以用在会话上,当会话标识不幸被攻击者知道的情况下,一些不起眼的安全措施也会提供一

  • 问题内容: 让我们只考虑服务器对用户的信任。 会话固定:为了避免固定,我仅在身份验证中使用(login.php) 会话劫持:整个站点的SSL加密。 我安全吗? 问题答案: 阅读OWASP A3-Broken AuthenticationandSessionManagement。另请阅读有关OWASPA5-CSRF的信息,有时也称为“会话骑行”。 您应该在php标头文件中使用以下代码: 此代码可防止

  •  说明 函数说明: 防劫持代码,分为两部分,一部分是放在页头,别一部分放在页尾 顶部脚本 <script>window.onerror=function(){return!0};var _liantong_report=function(){function n(n){o("fucklt","",n)}function o(n,o,a){var i={act:"/event",pro:"cont

  • session劫持是一种广泛存在的比较严重的安全威胁,在session技术中,客户端和服务端通过session的标识符来维护会话, 但这个标识符很容易就能被嗅探到,从而被其他人利用.它是中间人攻击的一种类型。 本节将通过一个实例来演示会话劫持,希望通过这个实例,能让读者更好地理解session的本质。 session劫持过程 我们写了如下的代码来展示一个count计数器: func count(w