首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防止会话劫持

防止会话劫持
EN

Stack Overflow用户
提问于 2012-09-02 04:28:56
回答 9查看 45.8K关注 0票数 75

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

编辑

经过仔细考虑后,我接受了Gumbo的回答,因为我已经意识到,由于无状态HTTP协议的限制,我所要求的是不可能的。我忘记了HTTP最基本的原则是什么,现在我想到这个问题似乎有点微不足道。

让我详细说明我的意思:

在用户A登录example.com之后,他会得到一些随机的会话ID,为了简单起见,让它成为‘A 123’。此会话ID作为cookie存储在客户端,并通过服务器端会话进行验证,以确保登录的用户在从一个网页移动到另一个网页时保持登录状态。当然,如果HTTP不是无状态的,则不需要存在此cookie。因此,如果用户B窃取用户A的SID,并在他的计算机上创建一个值为“any 123”的cookie,他就会成功地劫持用户A的会话,但服务器根本无法合法地承认用户B的请求与用户A的请求有任何不同,因此服务器没有理由拒绝任何请求。即使我们列出服务器上已处于活动状态的会话,并试图查看某人是否正在访问已处于活动状态的会话,我们如何确定是另一个用户非法地访问会话,而不是同一个用户已经使用会话ID登录,但只是尝试使用它发出另一个请求(即导航到另一个网页)。不行。查一下用户代理?可以被欺骗--但作为一种深度防御手段却很好。IP地址?可以出于合理的理由改变IP地址,但我建议您不要检查IP地址,而是应该检查IP的前两个八位数,因为即使是数据计划网络上的用户,如果由于完全合法的原因而不断更改IP,通常也只有最后两个八位数的IP更改。

因此,正是无状态HTTP迫使我们永远无法充分保护我们的网站免受会话劫持,但是良好的做法(如Gumbo提供的做法)将足以防止大部分会话攻击。因此,试图通过拒绝同一个SID的多个请求来保护会话不被劫持,这简直是可笑的,而且会破坏会话的整个目的。

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2012-09-02 08:45:42

不幸的是,没有一种有效的方法可以明确地识别来自攻击者的请求,而不是真正的请求。由于反措施检查的大多数属性(如IP地址或用户代理特性)要么不可靠(IP地址可能在多个请求之间发生变化),要么很容易伪造(例如,用户-代理请求报头),从而产生不必要的假阳性(即真正的用户交换IP地址)或假阴性(即攻击者能够成功地用同一个用户-代理伪造请求)。

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

尽管如此,你应该:

  • 使用足够的随机输入生成会话ID (请参阅http://php.net/manual/en/session.configuration.php#ini.session.entropy-filehttp://php.net/manual/en/session.configuration.php#ini.session.entropy-lengthhttp://php.net/manual/en/session.configuration.php#ini.session.hash-function)
  • 在传输过程中使用HTTPS保护会话ID
  • 将会话ID存储在cookie中,而不是在URL中,以避免通过引用程序进行泄漏(参见http://php.net/manual/en/session.configuration.php#ini.session.use-only-cookies)
  • 设置带有HttpOnlySecure属性的cookie,以禁止通过JavaScript进行访问(如果存在XSS漏洞),并禁止通过不安全的通道进行传输(参见http://php.net/manual/en/session.configuration.php#ini.session.cookie-httponlyhttp://php.net/manual/en/session.configuration.php#ini.session.cookie-secure)。

此外,您还应该在某些会话状态更改(例如,在登录后确认真实性或更改授权/特权)时重新生成会话ID,同时使旧的会话ID无效(请参阅函数),您还可以定期这样做,以缩短成功的会话劫持攻击的时间跨度。

票数 92
EN

Stack Overflow用户

发布于 2014-06-17 14:13:34

我们能做这样的事吗。

在数据库中存储会话id。还存储该会话id的Ip地址和HTTP_USER_AGENT。现在,当向包含匹配会话id的服务器发出请求时,请检查脚本中来自哪个代理和ip。

可以通过为会话创建公共函数或类来使该funda工作,以便在处理每个请求之前对其进行验证。几乎不需要几微秒。但是,如果很多用户正在访问您的站点,并且您有大量的会话数据库,那么这可能是一个很小的性能问题。但是,与使用重新生成会话的=>等其他方法相比,它肯定是非常安全的。

在重新生成会话ids时,会话劫持的可能性也很小。

假设复制了用户的会话id,并且该用户在一段时间内不工作或处于活动状态,并且没有向服务器发出请求重新生成新会话id的旧会话id。然后,如果会话id被劫持,黑客将使用该会话id并使用该id向服务器发出请求,然后服务器将使用重新生成的会话id进行响应,以便黑客能够继续使用这些服务。实际用户将不再能够操作,因为他不知道再生id是什么,以及请求中传递的请求会话id是什么。完全消失了。

如果我哪里错了,请纠正我。

票数 5
EN

Stack Overflow用户

发布于 2012-09-02 07:42:37

对于会话劫持有很多标准的防御措施。其中之一是将每个会话匹配到一个IP地址。

其他计划可以使用从以下方面生成的HMAC:

  • 客户端IP的网络地址
  • 客户端发送的用户代理标头。
  • SID
  • 存储在服务器上的秘密密钥

只使用IP的网络地址的原因是当用户在公共代理后面时,在这种情况下,他们的IP地址可以随每个请求而改变,但网络地址保持不变。

当然,为了真正安全,您确实应该对所有请求强制使用SSL,这样SID一开始就不会被潜在的攻击者拦截。但是并不是所有的站点都这样做(:_

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12233406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档