速率限制?"/>
我如何对我的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); } } }
编辑
对于遇到类似问题的任何人,我最终尝试了几种不同的方法来实现这一目标,并且是最简单的方法:
- 编写您自己的allowRequest
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 });
- 选择其他路由,使用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路由进行速率限制?
发布评论