阻止从socket.io中的子域访问

时间:2015-08-29 22:34:06

标签: javascript node.js socket.io

我只是在连接来自的网站是我服务器上列入白名单的子域之一时才尝试允许访问socket.io。如果我每次客户端连接到我的socket.io服务器时都可以检查origin子域,那将是最好的。我试着找出怎么做,但还没有找到一个好的解决方案。 唯一接近解决方案的是this answer to a related question。但是 - 我不确定这是否是最好的方法,如果它甚至适用于我的情况,也不能通过javascript伪造。

TLDR :如何根据源的不同对待socket.io请求?如果那是不可能的:我如何在两个子域上托管两个socket.io服务器,但是同一个端口?

关于重复标记:我的问题完全不同。我不能使用命名空间作为解决方案,因为我不相信在某些子域上运行的客户端javascript。因此,这些子域名可能只是加入一个不同的命名空间,这将使我的努力将它们分开是毫无意义的。

2 个答案:

答案 0 :(得分:0)

我在socket.io slack服务器上的某个人的帮助下找到了这个答案。

io.on('connection', function (socket) {
    var subdomain = socket.handshake.headers.host.split('.')[0];
    if (subdomain === 'allowed') {
        socket.on('login', /* ... */);
    } else {
        socket.on('login', function () {
           console.log('login disabled, wrong subdomain'); 
        });
    }
}

我不知道它是可靠的还是可以通过恶意客户端javascript进行修改,但在我测试时看起来非常好。

答案 1 :(得分:0)

我将这个修改代码添加到express / socket.io中间件函数中,以便在每个请求上调用它:connect,disconnect和streaming。

我也使用express-subdomain npm https://www.npmjs.com/package/express-subdomain

   app.sio.use((socket, next) => {
      var subdomain = socket.request.headers.host
      sessionMiddleware(socket.request, {}, next)
   })