如果满足某个条件(登录尝试次数过多),我想阻止对给定 IP 地址的所有进一步请求。为了实现这一目标,我目前正在浏览
Node.js
和 express
文档,但我找不到合适的方法来允许我 abort 请求。到目前为止我能想到的只是一个常规的 res.status(403).end()
,但是它在 HTTP 级别上发送了完整的答案。
因此,我想中止 TCP 级别上已经存在的连接。我的想法是这样的:
server.on('connection', (sock) => { if (shouldBlock(...) sock.destroy(); });
这会按照我想要的方式工作吗?还是这是一种不好的做法?它似乎有效,但我很好奇这是否会对其他(非阻塞)请求造成任何泄漏、问题或副作用?
如果您想让被阻止的 IP 变得烦人,那么您可以使用以下内容添加延迟:
setTimeout(() => res.status(403).end(), 10000);
但我不会这样做有两个原因。首先,服务器的工作量比立即响应要多。其次,您可能会阻塞并浪费您和客户端之间的某些代理服务器的资源 - 包括您自己的反向代理等。
出于同样的原因,我也不建议默默地断开连接,这也可能会给您自己的服务器带来一些问题。
您可以做的是向路由表添加规则,以在某些 IP 地址的连接到达您的节点服务器之前删除它们。请记住,如果连接到达您的 Node 应用程序,那么即使它们被您的应用程序丢弃,它们仍然会攻击您的应用程序并浪费您的资源。
例如,在 Linux 上,您可以像这样阻止某个 IP:
iptables -A INPUT -s 1.2.3.4 -j DROP
其中 1.2.3.4 是您要阻止的 IP 地址。
在 Node 中,您可以使用 node-iptables。
我当然不建议将被阻止的 IP 存储在数据库中并在每个请求时检查它,因为这对您的服务器来说比一开始就服务这些请求要做更多的工作。如果您为此创建数据库,请确保它是 Redis 或其他一些快速内存数据库。
您还需要考虑的是,很多时候人们都位于 NAT 后面,因此例如整个公司或学校可以使用相同的 IP 地址。因为一个孩子尝试登录次数过多而默默地断开与整个学校的连接,会让该学校的其他人认为您的服务已损坏。这样的功能可以用于您的服务器,故意对某些人禁用它。
req.on('aborted', ()=> {
console.log('Aborted)
})
参考:'https:/在此处输入代码/github.com/expressjs/multer/issues/259'