【问题标题】:block access from subdomains in socket.io阻止来自 socket.io 中子域的访问
【发布时间】:2015-08-29 22:34:06
【问题描述】:

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

TLDR:如何根据来源不同地处理 socket.io 请求?如果这不可能:如何在两个子域上托管两个 socket.io 服务器,但端口相同?

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

【问题讨论】:

  • aug 不幸的是,这只会适得其反。我想将我的大部分子域保留在我的 socket.io 服务器之外,而不是包括它们。我不能信任某些子域上的一些客户端 javascript,因此不能使用命名空间,因为客户端 js 可以轻松加入另一个。

标签: javascript node.js socket.io


【解决方案1】:

我在 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 修改,但在我测试时它看起来相当不错。

【讨论】:

  • 只要意识到像这样的 http 标头可以被任何连接到您的服务器的可编程代理欺骗。这可能适用于来自标准浏览器的连接,因为它们不会欺骗或允许 Javascript 欺骗。
  • 是的,我认为没有办法阻止它,但我只使用此代码来保护使用我的应用程序的用户免受 javascript 文件获得比他们允许的更多的 api 访问。但是,如果用户想通过设置自定义浏览器/代理来破解自己的帐户 - 那不关我的事。 :)
【解决方案2】:

我将 this 修改代码添加到 express/socket.io 中间件函数中,以便在每个请求时调用它:连接、断开连接和流式传输。

我也使用 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)
   })

【讨论】:

    猜你喜欢
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 2015-07-30
    相关资源
    最近更新 更多