我最近一直在学习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'}); }
它会杀死服务器。
研究JS事件的节流和反跳!
这些技术将帮助您防止和检测到特定程度的攻击(在我看来,这足以用于小型多人套接字游戏)…
编辑:
在此jsfiddle中:http : //jsfiddle.net/y4tq9/9/
var sIO = {}; sIO.on = (function(){ var messages = {}; var speedLimit = 5; //5ms return function(message, handler) { messages[message] = messages[message] || {}; if(messages[message].timestamp && new Date().getTime() - messages[message].timestamp < speedLimit) return false; else messages[message].timestamp = new Date().getTime(); handler(); return true; //execute code, Ex: } }());
您会看到每个发送速度超过5ms的请求都将返回false,否则处理程序将运行。
您可以简单地断开发送请求的套接字,这些套接字的发送速度超过5毫秒(或2毫秒或3毫秒,具体取决于您的网络和应用程序的权重…)。
您不妨在客户端站点上使用js事件限制,以确保所有请求的发送速度都不会超过速度限制!
这项技术不会提供绝对的保护以防止被利用,但是它将防止您的服务器在攻击者尝试执行Dos时崩溃。