我的应用程序只需要socket.io将数据从服务器发送到客户端。为防止拒绝服务攻击,我想在尝试发送数据时断开客户端连接。这可能吗?
我已经查看了一些stackoverflow问题:
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 :(得分: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();
});
答案 1 :(得分: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();
});
就像我说的,这是一个非常不完整的例子,但它是一种实现你所寻找的东西的方法,即使是以较旧的方式。您可能不会更新显示进度的元素,而不是控制台日志记录。