Socket.io: So sichern Sie das 'io'-Cookie

Erstellt am 11. Okt. 2015  ·  23Kommentare  ·  Quelle: socketio/socket.io

Mir ist aufgefallen, dass socket.io (genauer gesagt engine.io) ein nicht sicheres Sitzungscookie namens 'io' für die aufgerufene URL setzt. Welche Rolle spielt dieses Cookie, ist es notwendig und wenn ja, kann es gesichert werden? Wir erzwingen https:// für alle Standorte, an denen socket.io ausgeführt wird, und könnten dieses Cookie leicht auf sichere setzen, aber ich kann nicht finden, wo.

Hilfreichster Kommentar

Habe kürzlich eine Warnung in der Chrome-Konsole zu diesem Cookie bemerkt:
Ein Cookie, das einer websiteübergreifenden Ressource unter (URL) zugeordnet ist, wurde ohne das Attribut SameSite . Eine zukünftige Version von Chrome wird Cookies mit Cross-Site-Requests nur dann bereitstellen, wenn sie auf SameSite=None und Secure .

Falls es jedem hilft, der hier sucht und hier landet, scheint das Setzen der Option cookie: false wie oben das Problem für mich gelöst zu haben. Ich erhalte die Warnung nicht mehr und die App funktioniert einwandfrei, ohne dass das Cookie gesetzt wird.

Alle 23 Kommentare

Es wird für nichts verwendet; Sie können es deaktivieren, indem Sie cookie: false in den Serveroptionen festlegen.

Beste Antwort ever - danke!

Schließung wie gelöst - Danke

@ Nibbler999 Wo sind diese Optionen? Wo genau setze ich diese Einstellung?

@wisniewski94 die Optionen sind hier dokumentiert: https://github.com/socketio/engine.io#methods -1

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

@darrachequesne vielen Dank! Ohne Ihre Hilfe wäre mir immer noch unklar, wie man sie benutzt. Es wäre eine gute Idee, der README.md ein Beispiel hinzuzufügen.

Im Allgemeinen kann dieses Cookie entfernt werden, wenn es nirgendwo verwendet wird.

Hallo @darrachequesne ,

Hier ist mein aktueller Code.

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

Der Server sendet jedoch weiterhin das Cookie io .
Gibt es ein Cookie-Problem bei der Integration von io mit dem Express-Server?

Danke.

Eine weitere Sache, gibt es eine Methode zum Senden des Headers Access-Control-Allow-Origin für eine Web-Socket-Anfrage (die 101 Switching Protocols Antwort)
Ich habe io.origins(config.origin) im Init-Schritt gesetzt, dies gilt jedoch nur für XHR-Anfragen.

Der Hintergrund ist, dass es sich bei einer Anfrage um eine anfällige Anfrage handelt, die nicht den richtigen Origin-Header setzt. Ist das richtig?

@tienlx93 Ich kann nicht reproduzieren: https://github.com/darrachequesne/socket.io-fiddle/tree/issues-2276

Der Hintergrund ist, dass es sich bei einer Anfrage um eine anfällige Anfrage handelt, die nicht den richtigen Origin-Header setzt. Ist das richtig?

Der Header Access-Control-Allow-Origin gilt nur für domänenübergreifende Anfragen ( MDN ). Wenn Sie die zulässigen Ursprünge mit io.origins() festlegen, sollte es in Ordnung sein.

Danke für die Information. Als Referenz eine andere Möglichkeit, dieses Cookie auf "false" zu setzen, wenn Express als Server verwendet wird:

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

@darrachequesne Gibt es in socket.io-2.0 eine Möglichkeit, dieses Cookie sicher zu setzen und aus der Abfragezeichenfolge zu entfernen.

@darrachequesne Gibt es in socket.io-2.0 eine Möglichkeit, dieses Cookie sicher zu setzen und aus der Abfragezeichenfolge zu entfernen.

kannst du bitte posten, wie das in socket.io^2.0 geht?

Habe kürzlich eine Warnung in der Chrome-Konsole zu diesem Cookie bemerkt:
Ein Cookie, das einer websiteübergreifenden Ressource unter (URL) zugeordnet ist, wurde ohne das Attribut SameSite . Eine zukünftige Version von Chrome wird Cookies mit Cross-Site-Requests nur dann bereitstellen, wenn sie auf SameSite=None und Secure .

Falls es jedem hilft, der hier sucht und hier landet, scheint das Setzen der Option cookie: false wie oben das Problem für mich gelöst zu haben. Ich erhalte die Warnung nicht mehr und die App funktioniert einwandfrei, ohne dass das Cookie gesetzt wird.

Habe kürzlich eine Warnung in der Chrome-Konsole zu diesem Cookie bemerkt:
Ein Cookie, das einer websiteübergreifenden Ressource unter (URL) zugeordnet ist, wurde ohne das Attribut SameSite . Eine zukünftige Version von Chrome wird Cookies mit Cross-Site-Requests nur dann bereitstellen, wenn sie auf SameSite=None und Secure .

Falls es jedem hilft, der hier sucht und hier landet, scheint das Setzen der Option cookie: false wie oben das Problem für mich gelöst zu haben. Ich erhalte die Warnung nicht mehr und die App funktioniert einwandfrei, ohne dass das Cookie gesetzt wird.

Bei mir funktioniert es nicht.

Mein Code:

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

Was ist falsch?

@GuilhermeCouto , ich denke, Sie müssen beim Initialisieren von _socket_ die Option {cookie: false} setzen, nicht http.listen. Die oben bereitgestellte Lösung, die für mich funktioniert hat, ist die, die Express verwendet:

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

Hoffe das hilft

@GuilhermeCouto , ich denke, Sie müssen beim Initialisieren von _socket_ die Option {cookie: false} setzen, nicht http.listen. Die oben bereitgestellte Lösung, die für mich funktioniert hat, ist die, die Express verwendet:

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

Hoffe das hilft

Danke Doug für die Antwort.
Nur noch eine Frage?
Was stelle ich in den Weg?
Mein System funktioniert wie folgt: Es gibt ein lokales Netzwerk, das andere PCs mit dem lokalen Server verbinden.
Die interne IP variiert für jeden Kunden.

Mein Code:

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);
 // }

}

Dieser Ausschnitt stammte aus der obigen Antwort von Ikende, daher bin ich mir nicht ganz sicher, worauf sich die Option path bezieht, aber ich glaube nicht, dass Sie sie angeben müssen. Wenn es hilft, hier sind die relevanten Ausschnitte meines Codes (ich verwende Typskript):

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 }

Es hat nicht funktioniert. =/

Welche Version von socket.io verwendest du?

2.2.0. Mein Gedächtnis ist irgendwie unscharf, aber ich denke, ich musste Chrome beenden und eine neue Instanz starten und/oder das Cookie manuell über die Chrome-Entwicklungstools auf der Anwendungsseite entfernen, um die Fehlerbehebung zu überprüfen. Bearbeiten: Ich musste wahrscheinlich auch die Serveranwendung beenden und neu starten.

Warum existiert es überhaupt, wenn es nicht verwendet wird?

Für diejenigen, die http- und https-Server verwenden, hat dies mit der Methode io.attach für mich funktioniert:

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

Im Gegensatz zu dem, was andere Leute hier sagen, ist dieses Cookie nützlich, um in einem System mit mehreren gleichzeitigen Instanzen eines socket.io-Servers für Klebrigkeit zu sorgen, wie hier in der Haproxy-Option erklärt: https://socket.io/docs/using- mehrere Knoten.

Da es jedoch keine Option gibt, sameSite für das Cookie zu setzen, können wir es nicht verwenden

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen