我如何对我的http服务器上的/socket.io路由进行速率限制?

编程入门 行业动态 更新时间:2024-10-10 15:19:40

我如何对我的http服务器上的/socket.io路由进行<a href=https://www.elefans.com/category/jswz/34/1771257.html style=速率限制?"/>

我如何对我的http服务器上的/socket.io路由进行速率限制?

我正在使用socket.io并使用rate-limiter-flexible和limiter来限制请求速率,但是我注意到路由/socket.io均未接收到429,实际上,我无法记录任何请求通过使用app.use('/socket.io')..]从此路线进入

我认为socket.io正在对这条路线进行一些处理,对吗?如果是这样,在达到限制后,如何确保发送到/socket.io的请求也收到429?

连接速率限制器:

this.io.on(this.SocketConstants.CONNECTION, async (client) => {
      this.client = client;
      try {
        await this.rateLimiter.consume(client.handshake.address);
      } catch (rejRes) {
        // On flood
        client.error('Too many requests');
        client.disconnect(true);
      }

http服务器上的速率限制器:

class RateLimiting {
    constructor() {
        this.limiter = new RateLimiter(2, 'minute', true);
        this.index = this.index.bind(this);
    }

    index(req,res,next){
        try {
            this.limiter.removeTokens(1, function(err, remainingRequests) {
                if (remainingRequests < 1) {
                    res.writeHead(429, {'Content-Type': 'text/plain;charset=UTF-8'});
                    res.end('429 Too Many Requests - your IP is being rate limited');
                    // res.status(429).json({ message: 'Too many requests' });
                } else {
                    next();
                }
            });
        }
        catch(err){
            console.log('Error', err);
        }
    }
}

编辑

对于遇到类似问题的任何人,我最终尝试了几种不同的方法来实现这一目标,并且是最简单的方法:

  1. 编写您自己的allowRequest
  2. AllowRequest是通过/失败功能,可用于覆盖默认的“ checkRequest”功能(reference here)

checkBucket(err, remainingRequests) {
    remainingRequests < 1 ? false : true;
  }

allowRequest(req, callback) {
    const limit = this.limiter.removeTokens(1, this.checkBucket);
    callback(limit ? null : 'Too many requests', limit);
  }

服务器启动为

this.io = this.socketServer(server, 
        { 
          allowRequest: this.allowRequest
        });
  1. 选择其他路由,使用express添加所需的任何中间件并禁用默认路由

您可以通过将serveClient设置为false并将path设置为所需的值来完成此操作。

this.io = this.socketServer(服务器,{路径:“ / newSocketRoute”,serveClient:否});

这对我来说不太奏效,所以我提供套接字文件的方式可能出了点问题,但这是它的样子:

app.get("/socket", this.limiter.initialize(), function(req, res) {
        if (0 === req.url.indexOf('/newSocketRoute/socket.io.js.map')) {
          res.sendFile(join(__dirname, "../../node_modules/socket.io-client/dist/socket.io.js.map"));
        } else if (0 === req.url.indexOf('/newSocketRoute/socket.io.js')) {
          res.sendFile(join(__dirname, "../../node_modules/socket.io-client/dist/socket.io.js"));
        }
      });

我正在使用socket.io并使用rate-limiter-flexible和limiter来限制请求速率,但是我注意到路由/socket.io均未接收到429,实际上,我无法记录任何请求来自...

回答如下:

[Socket.io通过将自身作为request事件(socket.io代码reference here)的第一个侦听器插入,将其自身附加到您的http服务器,这意味着它完全绕过了任何Express中间件。

更多推荐

我如何对我的http服务器上的/socket.io路由进行速率限制?

本文发布于:2024-05-07 15:42:31,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1756972.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:速率   路由   器上   http   io

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!