【发布时间】:2013-12-24 11:48:48
【问题描述】:
我最近一直在学习 node.js 和 socket.io。我的问题是如何保护服务器免受客户端攻击?
这是我的服务器代码
io.sockets.on('connection', function (socket) {
//users.push(socket);
socket.on('message', function (data) {
socket.on('disconnect', function () { });
socket.on('bcast', function (data) {
socket.emit('news', { 'data': data });
socket.broadcast.emit('news', { 'data': data });
});
socket.on('login', function(data){
socket.emit('login', {'data': [ socket.id, data ] });
});
});
});
例如,如果客户使用 chrome 开发者工具来做流动代码
for(var i = 0; i<99999999999; i++)
{
socket.emit('bcast', {data: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'});
}
它会杀死服务器。
【问题讨论】:
-
如果这真的会杀死您的服务器,您可能应该基于客户端等实施某种限制。
-
Node 0.10.20 有已知的 DoS 问题,如果你正在使用它(或者更低,我认为)。
-
为什么不使用 DoS 保护/限制服务公开节点套接字端点?我相信 cloudflare 或类似的提供商会提供非常好的 DoS 保护,而不是您自己尝试推出。
-
非常好的问题,没有好的答案!
-
也许你把问题发挥到了极致。像这样暴露/滥用 bcast 是不好的。如果您过多地使用广播,您的服务器甚至会在您的用户进行 DDOS 之前停止运行。你为什么不通过将广播与单发射不同来测试你的场景。以房间为例。仅在需要时使用广播。