如何设置socket.io origin来限制与一个url的连接

时间:2013-04-02 18:39:47

标签: javascript node.js socket.io

我们有一个html站点和一个为该网站提供服务的node.js服务器。 网站和服务器使用socke.io交换数据。 我们在文档中找到了这个:

来源默认为 *:*     允许连接到Socket.IO服务器的来源。

我们的html.site位于http://questionexample.com/page1。 只有这个站点可以连接到我们的服务器。(但每个人都可以连接到该网站。) 我们如何设置起源?

5 个答案:

答案 0 :(得分:35)

如果你深入研究Socket.io源代码,你会发现这样的行:

var origin = request.headers.origin || request.headers.referer
  , origins = this.get('origins');

...

var parts = url.parse(origin);
parts.port = parts.port || 80;
var ok =
  ~origins.indexOf(parts.hostname + ':' + parts.port) ||
  ~origins.indexOf(parts.hostname + ':*') ||
  ~origins.indexOf('*:' + parts.port);

正如您所看到的,Socket.io接收来自客户端的源(或引用),检索域名和端口, 并与您指定的origins选项进行比较。

因此有效origins值为(*表示“任何”):

  • testsite.com:80
  • http://testsite.com:80
  • http://*:8080
  • *:8080
  • testsite.com:* http://someotherdomain.com:8080 (多个来源以空格分隔)
  • testsite.com:*/somepath (socket.io将忽略/ somepath)
  • *:*

这些都是无效的(因为没有端口号):

  • testsite.com
  • http://testsite.com
  • http://testsite.com/somepath

另请注意,如果您将sub.testsite.com指定为原始值,则testsite.com有效来源。

答案 1 :(得分:9)

我遇到过类似的问题。 尝试在生产模式NODE_ENV=production node app.js中运行节点。 我有那段代码(as recommended here):

io.configure('production', function(){
    console.log("Server in production mode");
    io.enable('browser client minification');  // send minified client
    io.enable('browser client etag'); // apply etag caching logic based on version number
    io.enable('browser client gzip'); // the file
    io.set('log level', 1);           // logging
    io.set('transports', [            // all transports (optional if you want flashsocket)
        'websocket'
        , 'flashsocket'
        , 'htmlfile'
        , 'xhr-polling'
        , 'jsonp-polling'
    ]);
io.set('origins', 'http://questionexample.com/page1:*');
});

和Node在开发模式下运行,因此它根本无法工作。启用生产模式后一切正常。

我知道答案有点迟,但也许其他人会使用

答案 2 :(得分:0)

对于socket.io的较新版本(直到当前的2.2.0,您需要将CORS来源设置为服务器选项的一部分。

对于那些不使用express或不使用原始socket.io引擎的人来寻找的人,这是一个非常简单/基本的配置块;

// Options for socket.io > 1.0.0
var options = {
        allowUpgrades: true,
        transports: [ 'polling', 'websocket' ],
        pingTimeout: 9000,
        pingInterval: 3000,
        cookie: 'mycookie',
        httpCompression: true,
        origins: '*:*' <---- Allow any origin here
};

io = require('socket.io')(8010, options);

如果要限制原点,则应根据需要使用origins: 'host-name:port-num'

答案 3 :(得分:0)

您可以在服务器端使用您网站的网址进行类似的操作

  if (origin !== 'https://foo.example.com') {
    return callback('origin not allowed', false);
  }
  callback(null, true);
});

答案 4 :(得分:-1)

我认为io.set('origins', http://questionexample.com/page1)应该这样做