所以我只是学习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
});
答案 0 :(得分:0)
您还没有真正披露我们为您提供有关您的具体情况的信息,因此我将一般性地描述这是如何工作的以及您做了什么而不用担心。
如果使用TLS运行socket.io连接,则所有数据在传输过程中都受到保护,并且不能被中间人攻击窥探。如果您的socket.io连接不是TLS,那么网络窥探者可以看到数据。
仅保护与socket.io建立连接的/account
路由表单是不够的。您还必须保护socket.io连接本身。否则,任何代码管理员都可以编写一个脚本,该脚本将与您的服务器建立socket.io连接,您将很乐意让它连接并发送数据。您需要在socket.io连接本身上进行身份验证。 socket.io为此提供了中间件支持,如果您已经有/account
页面的经过身份验证的会话,那么您可以在允许socket.io连接之前实现需要经过身份验证的会话的中间件。然后,您将获得对socket.io连接的auth支持。
我的问题是,如果数据是从服务器发出的,是否可以在受保护/帐户路由之外进行监听,然后查看是否有人知道该事件的名称?
如果您的socket.io连接没有运行加密通道(如TLS),则可以窥探它。有人不必知道事件的名称(可以通过其他方式看到),只需在网页中查看客户端JS就可以相对容易地找出消息名称。
如果是这样,在受保护的路由上呈现帐户视图是没用的,我需要弄清楚如何在允许服务器发出数据之前对用户进行身份验证......对吗?
我不会说没用,但它不足以为socket.io连接提供保护。该连接需要它自己的身份验证实现,这可能会捎带您在/account
页面上执行的相同身份验证。
摘要:在TLS上运行socket.io(在服务器上支持https并使用https://xxxx
URL连接socket.io)然后为socket.io连接实现身份验证