2015-04-19 21 views
0

我有一個非常簡單的Socket.IO羣聊系統(this one)。我想阻止人們使用JavaScript欺騙來從瀏覽器中發送新的連接。有一次,我宣傳了這個網站,這是一個問題。如何使用Socket.IO從一個用戶執行最大數量的連接?

我應該使用什麼措施來防止這種情況?我想統計瀏覽器的連接數量,並且它超過了閾值,我想刪除所有連接。我應該使用IP地址嗎? socket.id是用戶特有的嗎?我應該怎麼做?

如果您想查看Socket.IO代碼,請參閱highlighted code here

回答

0

我在多人遊戲中遇到了同樣的問題,以防止用戶通過多個選項卡進行遊戲。

客戶可以通過多種方式拒絕識別,並以多種身份登錄。但由於您只想阻止用戶使用同一個瀏覽器,所以它相對容易。

首先,使用passport進行身份驗證和passport.socketio從快遞中間件「橋」 req.usersocket.request.user

其次,由於io.on('connection')永遠火來自客戶端的最新的套接字請求,您可以以此爲契機,從相同客戶端連接的任何舊套接字「過期」。這是socket.request.user將派上用場的地方,以確定它是否是相同的用戶客戶端。類似這樣的:

io.on('connection', function(socket) { 
    var user = socket.request.user; 

    // Suppose this user has connected from another tab, 
    // then the socket.id from current tab will be 
    // different from [see *1] 

    var current_socket_id = socket.id; 
    var last_socket_id = user.latest_socket_id; 

    if (last_socket_id) { 
     // If the user has an existing socket connection 
     // from the previously opened tab, 

     // Send disconnection request to the previous socket 
     io.to(last_socket_id).emit('disconnect'); 
     // client-side will look like 
     // socket.on('disconnect', function(){ 
     //  alert('You connected from a new tab, this tab will close now.') 
     //  window.close(); 
     // }); 
    } 

    // [*1] current socket.id is stored in the user 
    user.latest_socket_id = socket.id; 
    user.save(); 
}); 
+0

我忘了提及這個羣聊沒有被認證。 – Antrikshy

+0

您可以使用隨機生成的憑據進行僞身份驗證,無需用戶輸入。 – laggingreflex

相關問題