我一直在学习node.js和套接字.我最近很忙.我的问题是如何保护服务器免受客户端攻击?

This is my server code

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 developer工具来执行流畅的代码

 for(var i = 0; i<99999999999; i++)
 {
        socket.emit('bcast', {data: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'});
 }

它会杀死服务器.

推荐答案

查看JS事件节流和go Bouncing!

这些技术将帮助你在一定程度上防止和检测攻击(在我看来,这对于一个小型多人套接字游戏来说已经足够了)...

编辑:

在这个JSFIDLE中: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:
    }
}());

您可以看到,每一个发送速度超过5毫秒的请求都会返回false,否则处理程序就会运行.

您只需断开发送请求速度超过5毫秒(或2毫秒,或3毫秒,具体取决于您的网络和应用程序的重量…)的套接字.

您还可以在客户端站点上使用js事件限制,以确保所有请求的发送速度不会超过速度限制!

这种技术不会提供绝对的保护,防止攻击者利用它进行攻击,但它可以防止攻击者试图Dos时服务器崩溃...

Node.js相关问答推荐

Node.js promise 循环中的所有多个API调用

序列化事务未按预期工作

使用NodeJS在S3上传文件时的格式问题

如何使用MongoDB在Node.js 中向数组中添加项?

已知NPM无法在node.js V12上运行的问题

获取页面大小为10的所有文章,每篇文章填充一些所需的用户信息

条件内的表达式

如何使用NodeJS在mongodb中更新文档

为什么即使数据库确实更新了,此 POST 也无法解析并返回 200 代码?

如何在 Firestore 函数上使用类型模型来获取字段值

如何在没有 Typescript 的情况下以交互方式使用 Create-React-App?

React Native:执行 com.android.build.gradle.internal.tasks.Workers$ActionFacade 时发生故障

Ansible 将以什么用户身份运行我的命令?

制作一个接受命令行参数的脚本

如何创建安全(TLS/SSL)Websocket 服务器

在 Node.js 中获取终端的宽度

webpack-dev-server 找不到模块webpack

Node.js 中的 PHP exit()/die() 类似功能是什么

我无法全局安装 nodemon,nodemon无法识别

桌面应用程序仅支持 oauth_callback 值 'oob'/oauth/request_token