Socket.io: Cara mengamankan cookie 'io'

Dibuat pada 11 Okt 2015  ·  23Komentar  ·  Sumber: socketio/socket.io

Saya perhatikan bahwa socket.io (tepatnya engine.io) sedang menyetel cookie sesi yang tidak aman yang disebut 'io' pada URL yang dipanggil. Apa peran cookie ini, apakah perlu dan jika demikian, dapatkah diamankan? Kami memaksa https:// untuk semua lokasi di mana socket.io berjalan, dan dapat dengan mudah mengatur cookie ini untuk mengamankan tetapi saya tidak dapat menemukan di mana.

Komentar yang paling membantu

Baru-baru ini melihat peringatan di konsol Chrome mengenai cookie ini:
Cookie yang terkait dengan sumber daya lintas situs di (URL) disetel tanpa atribut SameSite . Rilis Chrome di masa mendatang hanya akan mengirimkan cookie dengan permintaan lintas situs jika disetel dengan SameSite=None dan Secure .

Jika ini membantu siapa saja yang mencari dan berakhir di sini, menyetel opsi cookie: false seperti di atas tampaknya telah memecahkan masalah bagi saya. Saya tidak lagi mendapatkan peringatan dan aplikasi berfungsi dengan baik tanpa cookie disetel.

Semua 23 komentar

Itu tidak digunakan untuk apa pun; Anda dapat menonaktifkannya dengan mengatur cookie: false di opsi server.

Jawaban terbaik yang pernah ada - terima kasih!

Menutup sebagai terselesaikan - terima kasih

@Nibbler999 Di mana opsi ini? Di mana tepatnya saya meletakkan pengaturan ini?

@wisniewski94 opsi didokumentasikan di sini: https://github.com/socketio/engine.io#methods -1

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

@darrachequesne terima kasih banyak! Tanpa bantuan Anda, masih belum jelas bagi saya bagaimana menggunakannya. Sebaiknya tambahkan contoh ke README.md.

Pada catatan yang lebih luas, cookie itu dapat dihapus, jika tidak digunakan di mana pun.

Hai @darrachequesne ,

Ini kode saya saat ini.

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

Namun, server masih mengirim cookie io .
Apakah ada masalah cookie saat mengintegrasikan io dengan server ekspres?

Terima kasih.

Satu hal lagi, apakah ada metode untuk mengirim header Access-Control-Allow-Origin untuk permintaan soket web (respons 101 Switching Protocols )
Saya telah menetapkan io.origins(config.origin) pada langkah init, namun, itu hanya berlaku untuk permintaan XHR.

Latar belakangnya adalah jika ada permintaan yang tidak mengatur header Asal yang benar adalah permintaan yang rentan, apakah ini benar?

@tienlx93 Saya tidak dapat mereproduksi: https://github.com/darrachequesne/socket.io-fiddle/tree/issues-2276

Latar belakangnya adalah jika ada permintaan yang tidak mengatur header Asal yang benar adalah permintaan yang rentan, apakah ini benar?

Header Access-Control-Allow-Origin hanya berlaku untuk permintaan lintas domain ( MDN ). Jika Anda mengatur asal yang diizinkan dengan io.origins() , itu akan baik-baik saja.

Terimakasih atas infonya. Untuk referensi, cara lain untuk menyetel cookie ini salah saat menggunakan express sebagai server:

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

@darrachequesne Di socket.io-2.0, apakah ada cara untuk mengatur cookie ini aman dan menghapusnya dari string kueri.

@darrachequesne Di socket.io-2.0, apakah ada cara untuk mengatur cookie ini aman dan menghapusnya dari string kueri.

dapatkah Anda memposting cara melakukan ini di socket.io^2.0?

Baru-baru ini melihat peringatan di konsol Chrome mengenai cookie ini:
Cookie yang terkait dengan sumber daya lintas situs di (URL) disetel tanpa atribut SameSite . Rilis Chrome di masa mendatang hanya akan mengirimkan cookie dengan permintaan lintas situs jika disetel dengan SameSite=None dan Secure .

Jika ini membantu siapa saja yang mencari dan berakhir di sini, menyetel opsi cookie: false seperti di atas tampaknya telah memecahkan masalah bagi saya. Saya tidak lagi mendapatkan peringatan dan aplikasi berfungsi dengan baik tanpa cookie disetel.

Baru-baru ini melihat peringatan di konsol Chrome mengenai cookie ini:
Cookie yang terkait dengan sumber daya lintas situs di (URL) disetel tanpa atribut SameSite . Rilis Chrome di masa mendatang hanya akan mengirimkan cookie dengan permintaan lintas situs jika disetel dengan SameSite=None dan Secure .

Jika ini membantu siapa saja yang mencari dan berakhir di sini, menyetel opsi cookie: false seperti di atas tampaknya telah memecahkan masalah bagi saya. Saya tidak lagi mendapatkan peringatan dan aplikasi berfungsi dengan baik tanpa cookie disetel.

Ini tidak bekerja untuk saya.

kode saya:

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

Apa yang salah?

@GuilhermeCouto , saya pikir Anda perlu mengatur opsi {cookie: false} saat menginisialisasi _socket_, bukan http.listen. Solusi yang diberikan di atas yang berhasil bagi saya adalah solusi yang menggunakan express:

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

Semoga ini membantu

@GuilhermeCouto , saya pikir Anda perlu mengatur opsi {cookie: false} saat menginisialisasi _socket_, bukan http.listen. Solusi yang diberikan di atas yang berhasil bagi saya adalah solusi yang menggunakan express:

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

Semoga ini membantu

Terima kasih Doug atas jawabannya.
Hanya satu pertanyaan lagi?
Apa yang saya masukkan ke dalam jalur?
Sistem saya bekerja seperti ini: Ada jaringan lokal yang menghubungkan PC lain ke server lokal.
IP internal bervariasi untuk setiap pelanggan.

Kode saya:

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

}

Cuplikan itu berasal dari jawaban Ikende di atas jadi saya tidak sepenuhnya yakin apa yang dimaksud dengan opsi path , tetapi saya rasa Anda tidak perlu menentukannya. Jika membantu, berikut adalah cuplikan kode saya yang relevan (saya menggunakan TypeScript):

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 }

, {kuki: salah }

Itu tidak berhasil. =/

Versi socket.io apa yang Anda gunakan?

2.2.0. Memori saya agak kabur, tetapi saya pikir saya harus keluar dari Chrome dan memulai instance baru dan/atau menghapus cookie secara manual melalui Chrome Dev Tools di halaman Aplikasi untuk memverifikasi perbaikannya. Sunting: Saya mungkin juga harus mematikan dan memulai ulang aplikasi server.

Mengapa itu bahkan ada jika tidak digunakan?

Bagi mereka yang menggunakan server http dan https, dengan metode io.attach , ini berhasil untuk saya:

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

Berbeda dengan apa yang dikatakan orang lain di sini, cookie ini berguna untuk memberikan kekakuan dalam sistem dengan beberapa instance server socket.io secara bersamaan seperti yang dijelaskan di sini dalam opsi Haproxy: https://socket.io/docs/using- multi-node.

Namun karena tidak ada opsi untuk menyetel sameSite pada cookie, kami tidak dapat menggunakannya

Apakah halaman ini membantu?
0 / 5 - 0 peringkat