我有一個非常簡單的Socket.IO羣聊系統(this one)。我想阻止人們使用JavaScript欺騙來從瀏覽器中發送新的連接。有一次,我宣傳了這個網站,這是一個問題。如何使用Socket.IO從一個用戶執行最大數量的連接?
我應該使用什麼措施來防止這種情況?我想統計瀏覽器的連接數量,並且它超過了閾值,我想刪除所有連接。我應該使用IP地址嗎? socket.id
是用戶特有的嗎?我應該怎麼做?
如果您想查看Socket.IO代碼,請參閱highlighted code here。
我有一個非常簡單的Socket.IO羣聊系統(this one)。我想阻止人們使用JavaScript欺騙來從瀏覽器中發送新的連接。有一次,我宣傳了這個網站,這是一個問題。如何使用Socket.IO從一個用戶執行最大數量的連接?
我應該使用什麼措施來防止這種情況?我想統計瀏覽器的連接數量,並且它超過了閾值,我想刪除所有連接。我應該使用IP地址嗎? socket.id
是用戶特有的嗎?我應該怎麼做?
如果您想查看Socket.IO代碼,請參閱highlighted code here。
我在多人遊戲中遇到了同樣的問題,以防止用戶通過多個選項卡進行遊戲。
客戶可以通過多種方式拒絕識別,並以多種身份登錄。但由於您只想阻止用戶使用同一個瀏覽器,所以它相對容易。
首先,使用passport進行身份驗證和passport.socketio從快遞中間件「橋」 req.user
到socket.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();
});
我忘了提及這個羣聊沒有被認證。 – Antrikshy
您可以使用隨機生成的憑據進行僞身份驗證,無需用戶輸入。 – laggingreflex