【问题标题】:Socket.io - How secure is their session management?Socket.io - 他们的会话管理有多安全?
【发布时间】:2020-12-23 20:19:00
【问题描述】:

我目前正在开发一个 Web 应用程序,并想在其中引入一些基本的安全措施。在这种情况下,我正在调查 socket.io 用来处理用户会话的普通方法是否安全。从this article 我发现socket.io 收到的每个连接都会生成一个ID(即使它只是一个新的浏览器选项卡)。我想这可以看作是一个非常基本的会话 ID。现在我的问题是,这个 ID 是如何生成的,它是否足够随机以确保没有人可以通过猜测(无论是通过暴力破解还是某些统计数据)这样的活跃用户 ID 来劫持会话?

正如一些人要求澄清的那样:我试图避免攻击者劫持会话。这是因为攻击者可以轻松地暴力破解会话 ID,使用一些统计信息猜测它,因为它不够随机,或者能够使用网络嗅探/XSS 窃取它来窃取它存储的 cookie。

【问题讨论】:

  • “一些基本的安全措施”非常通用。你到底想做什么,你想保护什么?
  • 添加说明。
  • 为了再次保护网络嗅探,您必须使用 HTTPS。这对于整个传输来说是通用的,而不仅仅是 socket.io。
  • 是的,我确保使用 HTTPS。关于 XSS,我还验证了 cookie 使用了 HttpOnly 标志。

标签: node.js session socket.io


【解决方案1】:

从您的问题中不清楚您要实施什么“安全性”或您要保护什么。至于 sessionid,下面是它的生成方式,然后您可以决定这是否满足您的需求。

首先,socket.io 使用名为.generateId() 的方法来创建新 ID。它有一个默认实现(我们稍后会介绍),但如果您愿意,也可以根据doc here 将其替换为您的机制。

那么,这里是default implementation

    generateId(req) {
      return base64id.generateId();
    }

显然只是调用使用此代码的base64id module

Base64Id.prototype.generateId = function () {
  var rand = Buffer.alloc(15); // multiple of 3 for base64
  if (!rand.writeInt32BE) {
    return Math.abs(Math.random() * Math.random() * Date.now() | 0).toString()
      + Math.abs(Math.random() * Math.random() * Date.now() | 0).toString();
  }
  this.sequenceNumber = (this.sequenceNumber + 1) | 0;
  rand.writeInt32BE(this.sequenceNumber, 11);
  if (crypto.randomBytes) {
    this.getRandomBytes(12).copy(rand);
  } else {
    // not secure for node 0.4
    [0, 4, 8].forEach(function(i) {
      rand.writeInt32BE(Math.random() * Math.pow(2, 32) | 0, i);
    });
  }
  return rand.toString('base64').replace(/\//g, '_').replace(/\+/g, '-');
};

如果在存在crypto 模块的nodejs 上运行服务器,这将调用this.getRandomBytes(),并且该代码包含在您可以查看的同一模块中。它使用crypto.randomBytes(12)

然后,您可以自行决定这是否满足您的安全需求。或者,您可以将其替换为满足您需求的不同 id 生成器。仅供参考,一个 12 字节的随机数很难猜到。这是 256 提升到 12 次方大小的 id 空间。 256^12 等于 7.9228163e+28。

【讨论】:

  • 您好,谢谢您的回复!我添加了关于我确切想要保护的内容的说明。我阅读了this article 关于会话 ID 至少应该被视为“安全”的时间。这表明长度为 128 位,而 socket.io 似乎生成长度为 96 位的 id。您认为他们夸大了一点,96 应该足以不保证完全更改此代码?
  • @Astarno - 这真的取决于什么是利害攸关的,以及你将有多久的持久会话。对于我的金融账户的密码,我的标准与我的游戏会话略有不同。 96位还不错。 128 位更好,但更好多少可能无关紧要,因此额外的工作可能是浪费精力,可以更好地花在其他事情上,具体取决于您实际尝试保护的内容和时间。
猜你喜欢
  • 1970-01-01
  • 2014-06-19
  • 2016-05-05
  • 1970-01-01
  • 2015-09-03
  • 2013-12-01
  • 2011-12-23
  • 2015-07-21
  • 2013-10-03
相关资源
最近更新 更多