我注意到socket.io(准确地说是engine.io)在它被调用的URL上设置了一个名为“io”的非安全会话cookie。 这个 cookie 的作用是什么,是否有必要,如果有,是否可以保护? 我们对运行 socket.io 的所有位置强制使用 https://,并且可以轻松地将此 cookie 设置为安全,但我找不到位置。
它不用于任何事情; 您可以通过在服务器选项中设置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 标头是一个易受攻击的请求,这是正确的吗?
谢谢(你的)信息。 作为参考,另一种在使用 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=None
和Secure
设置,Chrome 的未来版本将仅提供具有跨站点请求的 cookie。
如果它可以帮助搜索并最终到达这里的任何人,则如上所述设置选项cookie: false
似乎已经为我解决了这个问题。 我不再收到警告,并且应用程序在没有设置 cookie 的情况下运行良好。
最近在 Chrome 控制台中注意到有关此 cookie 的警告:
与 (URL) 处的跨站点资源关联的 cookie 设置为没有SameSite
属性。 如果使用SameSite=None
和Secure
设置,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 的选项,我们不能使用它
最有用的评论
最近在 Chrome 控制台中注意到有关此 cookie 的警告:
与 (URL) 处的跨站点资源关联的 cookie 设置为没有
SameSite
属性。 如果使用SameSite=None
和Secure
设置,Chrome 的未来版本将仅提供具有跨站点请求的 cookie。如果它可以帮助搜索并最终到达这里的任何人,则如上所述设置选项
cookie: false
似乎已经为我解决了这个问题。 我不再收到警告,并且应用程序在没有设置 cookie 的情况下运行良好。