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

Mic*_*ler 13 javascript node.js socket.io

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

origin 默认为*:* 允许连接到Socket.IO服务器的原点.

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

Ole*_*leg 37

如果你深入研究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);
Run Code Online (Sandbox Code Playgroud)

如您所见,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则将是有效原点.


Rob*_*Rob 9

我有类似的问题.尝试在生产模式下运行节点NODE_ENV=production node app.js.我有那个代码(这里推荐):

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:*');
});
Run Code Online (Sandbox Code Playgroud)

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

我知道这是一个有点迟到的答案,但也许其他人会使用它


小智 -2

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

  • 最新版本不再支持 io.set。配置像 var socket = require('socket.io')({ // options go here }); 一样放在服务器上 (5认同)