从服务器发出的socket.io数据是否受到保护?

时间:2018-02-22 20:50:15

标签: node.js express authentication socket.io

所以我只是学习socket.io而且我认为我知道这很危险。我已经构建了一个测试(Node / Express)应用程序,该应用程序首先将您带到登录页面,然后在进行身份验证后将您重定向到帐户页面。帐户页面视图位于受保护的路由上,它侦听从服务器发出的特定事件,然后在浏览器中显示该数据。我的问题是,如果数据是从服务器发出的,是否可以在受保护的/account路由之外进行监听,然后查看是否有人知道事件的名称?如果是这样,在受保护的路由上呈现帐户视图是没用的,我需要弄清楚如何在允许服务器发出数据之前对用户进行身份验证......对吗?

为了澄清,我的设置如下:

来自server.js -

io.on('connection', (socket) => {
  console.log('New user connected...');
  socket.emit('data', {
    //data emitted
  });
});

来自account.js(我的account.hbs视图的js源脚本之一) -

socket.on('data', function (data) {
  //do some stuff with the data
});

1 个答案:

答案 0 :(得分:0)

您还没有真正披露我们为您提供有关您的具体情况的信息,因此我将一般性地描述这是如何工作的以及您做了什么而不用担心。

  1. 如果使用TLS运行socket.io连接,则所有数据在传输过程中都受到保护,并且不能被中间人攻击窥探。如果您的socket.io连接不是TLS,那么网络窥探者可以看到数据。

  2. 仅保护与socket.io建立连接的/account路由表单是不够的。您还必须保护socket.io连接本身。否则,任何代码管理员都可以编写一个脚本,该脚本将与您的服务器建立socket.io连接,您将很乐意让它连接并发送数据。您需要在socket.io连接本身上进行身份验证。 socket.io为此提供了中间件支持,如果您已经有/account页面的经过身份验证的会话,那么您可以在允许socket.io连接之前实现需要经过身份验证的会话的中间件。然后,您将获得对socket.io连接的auth支持。

  3.   

    我的问题是,如果数据是从服务器发出的,是否可以在受保护/帐户路由之外进行监听,然后查看是否有人知道该事件的名称?

    如果您的socket.io连接没有运行加密通道(如TLS),则可以窥探它。有人不必知道事件的名称(可以通过其他方式看到),只需在网页中查看客户端JS就可以相对容易地找出消息名称。

      

    如果是这样,在受保护的路由上呈现帐户视图是没用的,我需要弄清楚如何在允许服务器发出数据之前对用户进行身份验证......对吗?

    我不会说没用,但它不足以为socket.io连接提供保护。该连接需要它自己的身份验证实现,这可能会捎带您在/account页面上执行的相同身份验证。

    摘要:在TLS上运行socket.io(在服务器上支持https并使用https://xxxx URL连接socket.io)然后为socket.io连接实现身份验证