Socket.io: 如何保护“io”cookie

创建于 2015-10-11  ·  23评论  ·  资料来源: socketio/socket.io

我注意到socket.io(准确地说是engine.io)在它被调用的URL上设置了一个名为“io”的非安全会话cookie。 这个 cookie 的作用是什么,是否有必要,如果有,是否可以保护? 我们对运行 socket.io 的所有位置强制使用 https://,并且可以轻松地将此 cookie 设置为安全,但我找不到位置。

最有用的评论

最近在 Chrome 控制台中注意到有关此 cookie 的警告:
与 (URL) 处的跨站点资源关联的 cookie 设置为没有SameSite属性。 如果使用SameSite=NoneSecure设置,Chrome 的未来版本将仅提供具有跨站点请求的 cookie。

如果它可以帮助搜索并最终到达这里的任何人,则如上所述设置选项cookie: false似乎已经为我解决了这个问题。 我不再收到警告,并且应用程序在没有设置 cookie 的情况下运行良好。

所有23条评论

它不用于任何事情; 您可以通过在服务器选项中设置cookie: false来禁用它。

最好的答案 - 谢谢!

关闭已解决 - 谢谢

@Nibbler999这些选项在哪里? 我究竟把这个设置放在哪里?

@wisniewski94选项记录在此处: https :

var io = require('socket.io')();
io.on('connection', function(client){});
io.listen(3000, {
  cookie: false
});

@darrachequesne非常感谢! 没有你的帮助,我仍然不清楚如何使用它们。 将示例添加到 README.md 是个好主意。

更广泛地说,如果没有在任何地方使用该 cookie,则可能会删除该 cookie。

@darrachequesne

这是我当前的代码。

var server = http.createServer(app);
var socket = require('socket.io');
var io = socket().listen(server,
    {
        cookie: false
    });

但是,服务器仍然发送 cookie io
io 和 express server 集成时 cookie 有问题吗?

谢谢。

还有一件事,是否有任何方法可以为 Web 套接字请求( 101 Switching Protocols响应)发送标头Access-Control-Allow-Origin
我在 init 步骤中设置了io.origins(config.origin) ,但是,它仅适用于 XHR 请求。

背景是如果有一个请求没有设置正确的 Origin 标头是一个易受攻击的请求,这是正确的吗?

@tienlx93我无法重现: https :

背景是如果有一个请求没有设置正确的 Origin 标头是一个易受攻击的请求,这是正确的吗?

Access-Control-Allow-Origin标头仅适用于跨域请求( MDN )。 如果您使用io.origins()设置允许的来源,应该没问题。

谢谢(你的)信息。 作为参考,另一种在使用 express 作为服务器时将此 cookie 设置为 false 的方法:

var server = require('http').createServer(express());
var io = require('socket.io')(server, { path:"/some/path", cookie: false });

@darrachequesne在 socket.io-2.0 中,有没有办法将此 cookie 设置为安全并将其从查询字符串中删除。

@darrachequesne在 socket.io-2.0 中,有没有办法将此 cookie 设置为安全并将其从查询字符串中删除。

你能在socket.io^2.0中发布如何做到这一点吗?

最近在 Chrome 控制台中注意到有关此 cookie 的警告:
与 (URL) 处的跨站点资源关联的 cookie 设置为没有SameSite属性。 如果使用SameSite=NoneSecure设置,Chrome 的未来版本将仅提供具有跨站点请求的 cookie。

如果它可以帮助搜索并最终到达这里的任何人,则如上所述设置选项cookie: false似乎已经为我解决了这个问题。 我不再收到警告,并且应用程序在没有设置 cookie 的情况下运行良好。

最近在 Chrome 控制台中注意到有关此 cookie 的警告:
与 (URL) 处的跨站点资源关联的 cookie 设置为没有SameSite属性。 如果使用SameSite=NoneSecure设置,Chrome 的未来版本将仅提供具有跨站点请求的 cookie。

如果它可以帮助搜索并最终到达这里的任何人,则如上所述设置选项cookie: false似乎已经为我解决了这个问题。 我不再收到警告,并且应用程序在没有设置 cookie 的情况下运行良好。

它对我不起作用。

我的代码:

http.listen(port, {cookie: false}, function(){
  console.log('listening on *:' + port);
});

怎么了?

@GuilhermeCouto ,我认为您需要在初始化 _socket_ 时设置{cookie: false}选项,而不是 http.listen。 上面提供的对我有用的解决方案是使用 express 的解决方案:

var server = require('http').createServer(express());
var io = require('socket.io')(server, { path:"/some/path", cookie: false });

希望这可以帮助

@GuilhermeCouto ,我认为您需要在初始化 _socket_ 时设置{cookie: false}选项,而不是 http.listen。 上面提供的对我有用的解决方案是使用 express 的解决方案:

var server = require('http').createServer(express());
var io = require('socket.io')(server, { path:"/some/path", cookie: false });

希望这可以帮助

谢谢道格的回复。
再问一个问题?
我在路径中放了什么?
我的系统是这样工作的:有一个本地网络,其他电脑连接到本地服务器。
每个客户的内部 IP 都不同。

我的代码:

var app = require("express")();
var http = require("http").Server(app);
var io = require("socket.io")(http);
var port = process.env.PORT || 3000;

// maps socket.id to user"s nickname
var nicknames = {};
// list of socket ids
var clients = [];
var namesUsed = [];

app.get("/", function(req, res){
  res.sendFile(__dirname + "/index.html");
});

io.on("connection", function(socket){  
    handleNewUser(socket);  
    handleTV(socket);
    //showActiveUsers(socket);
    handleClientDisconnections(socket);
    handleMessageBroadcasting(socket);
    handlePrivateMessaging(socket);
});

http.listen(port, function(){
  console.log("listening on *:" + port);
});

function handleTV(socket) {
    socket.on("flugo message", function(msg){
        console.log("flugo message"); 
       io.emit("flugo message", msg);
    });
}

function handleNewUser(socket){
  socket.on("user join", function(atendente) { 
  console.log("user join");   
  if (atendente) {      
        var ind = namesUsed.indexOf(atendente.nome);
        if (ind !== -1) {
          //ja tem alguem com esse nome, pode ser a mesma conexao da mesma pessoa
          clients[ind] = socket;
          nicknames[socket.id] = atendente;
        }else
        {
            ind = namesUsed.push(atendente.nome) - 1;
            clients[ind] = socket;
            nicknames[socket.id] = atendente;
        }

        //io.sockets.emit("new user", {id: ind, from: from});
        showActiveUsers(socket);
    }
  });
}

function handleMessageBroadcasting(socket){
  socket.on("message", function(msg,callback){
    console.log("message"); 
    if(nicknames[socket.id])
    {
        var from = nicknames[socket.id].nome;
        var user_id = nicknames[socket.id].id;
        var now = new Date();
        io.sockets.emit("message", {id: user_id, from: from, date: now.getTime(), msg: msg}); 
        callback("message");   
    }
  });
}

function handlePrivateMessaging(socket){
  socket.on("private message", function(data, callback){
    console.log("private message"); 
    if(nicknames[socket.id])
    {
        var from = nicknames[socket.id].nome;  
        var user_id = nicknames[socket.id].id;   
        var ind = namesUsed.indexOf(data.userToPM);
        if (ind !== -1) {
            var now = new Date();
            clients[ind].emit("private message", {id: user_id, from: from, date: now.getTime(), msg: data.msg}, function(data2, callback2){
                callback("private message");
            });         
        } 
    }   
  });
}

function handleClientDisconnections(socket){
  socket.on("disconnect", function(){
    console.log("disconnect"); 
    if(nicknames[socket.id])
    {
        var ind = namesUsed.indexOf(nicknames[socket.id].nome);
        var at = nicknames[socket.id];
        delete namesUsed[ind];
        delete clients[ind];
        delete nicknames[socket.id];
        io.sockets.emit("user disconnect", at);
    }
  });
}

function showActiveUsers(socket){
  var activeNames = [];
  var usersInRoom = io.sockets.sockets;
  console.log("names"); 
  //if(usersInRoom!===undefined){
    for (var index in usersInRoom){
        var userSocketId = usersInRoom[index].id;
        if (nicknames[userSocketId]){
          var name = nicknames[userSocketId].nome;
          activeNames.push({id: namesUsed.indexOf(name), from: name});
        }
      }
      io.sockets.emit("names", activeNames);
 // }

}

该片段来自上面 Ikende 的回答,所以我不完全确定path选项指的是什么,但我认为您不需要指定它。 如果有帮助,这里是我的代码的相关片段(我正在使用打字稿):

import * as express from 'express';
import { createServer, Server } from 'http';
import * as socketIo from 'socket.io';

this.app = express();
this.server = createServer(this.app);
this.io = socketIo(this.server, { cookie: false });
this.server.listen(this.port, () => {
            this.log('Running server on port ' + this.port);
        });
this.io.on('connect', (socket: SocketIO.Socket) => { bunch of code here }

, { cookie: false }

它没有用。 =/

您使用的是什么版本的 socket.io?

2.2.0. 我的记忆有点模糊,但我想我需要退出 Chrome 并启动一个新实例和/或通过应用程序页面上的 Chrome Dev Tools 手动删除 cookie 以验证修复。 编辑:我可能还必须终止并重新启动服务器应用程序。

如果不使用它,为什么它甚至存在?

对于那些使用 http 和 https 服务器的人,使用io.attach方法,这对我有用:

io.attach(httpServer, {cookie: false});
io.attach(httpsServer, {cookie: false});

与其他人在这里所说的相反,此 cookie 可用于在具有多个并发 socket.io 服务器实例的系统中提供粘性,如 Haproxy 选项中所述: https ://socket.io/docs/using-

但是由于没有在 cookie 上设置 sameSite 的选项,我们不能使用它

此页面是否有帮助?
0 / 5 - 0 等级