2015-04-04 59 views
0

我的應用程序只需要socket.io將數據從服務器發送到客戶端。爲了防止拒絕服務攻擊,我想斷開客戶端,如果我試圖發射數據。這可能嗎?是否有可能具有單向socket.io連接?

我已經看了一些計算器問題:

force client disconnect from server with socket.io and nodejs

How to protect against distributed denial-of-service attacks in Node.js with Socket.io?

但我一直沒能找到一個有效的解決方案。

+0

[服務器發送的事件]怎麼樣(http://stackoverflow.com/questions/5195452/websockets-vs-server-sent-events-eventsource) – laggingreflex 2015-04-04 14:19:35

+0

看到這個SO問題:http://stackoverflow.com/問題/ 21057882 /主要差異 - 雙向插座和方向插座 – MvdD 2015-04-04 17:30:33

+0

SSE認爲是安全的嗎?它是否防止拒絕服務? – Robin 2015-04-04 19:12:08

回答

0

有一個選項來緩存所有事件(從這裏Socket.io Client: respond to all events with one handler?)。

然後在任何情況下,您只需斷開服務器端的客戶端。

var socket = io.connect(); 
var globalEvent = "*"; 
socket.$emit = function (name) { 
    if(!this.$events) return false; 
    for(var i=0;i<2;++i){ 
     if(i==0 && name==globalEvent) continue; 
     var args = Array.prototype.slice.call(arguments, 1-i); 
     var handler = this.$events[i==0?name:globalEvent]; 
     if(!handler) handler = []; 
     if ('function' == typeof handler) handler.apply(this, args); 
     else if (io.util.isArray(handler)) { 
      var listeners = handler.slice(); 
      for (var i=0, l=listeners.length; i<l; i++) 
       listeners[i].apply(this, args); 
     } else return false; 
    } 
    return true; 
}; 
socket.on(globalEvent,function(event){ 
    //Force disconnect 
    socket.disconnect(); 
}); 
0

這可能不是很有幫助,但我所聽到的最好的是Comet streams。這是一種較老的方法,很多人不喜歡它(包括我自己),但它是單向服務器到客戶端更新的選項。

從本質上講,在客戶端你有連接到服務器的iframe,服務器發回的響應multipart的形式迴應,偶爾發回script標籤用的填充位來執行。所以,一個簡單的(也可能打破)的例子是這樣的:

<!--index.html--> 
<html> 
    <body> 
    <iframe src="/comet/status"></iframe> 
    </body> 
</html> 

,然後服務器代碼...

// server code (I like Node.JS) 
app.get('/comet/status', function (req, res) { 
    // A function that does a lot of work, 
    // and occasionally calls a callback with progress 
    doWork(function (progress) { 
    res.write('<script>console.log("Progress: " + progress);</script>'); 
    }); 
    res.end(); 
}); 

就像我說的,這是一個相當不完整的例子,但它是一個即使以更老的方式完成你要找的東西。而不是控制檯日誌記錄,你可能會更新顯示進度的元素。

相關問題