假设我有一个Node.JS服务器应用程序,我想阻止连续3次登录失败的用户,正确的方法是什么?
我应该在服务器应用程序中处理阻塞部分吗?基本上是在用户连接但尚未登录之后,还是在某个较低级别阶段我应该这样做,所以它甚至无法到达我的Node.JS应用程序?
为什么要阻止用户
作为一名安全研究员,我会给你一个通用的答案,它不是NodeJS的专用答案。
IP阻塞几乎是无效的,因为它可以很容易地更改。
如果你屏蔽了用户,攻击者可以通过暴力迫使其他用户或特定用户禁用他们的帐户,很容易地破坏你网站的部分可用性。
我个人使用挑战系统来覆盖这两种情况
- 计算IP登录尝试失败的次数
- 统计用户登录失败的次数
最后,在进行登录请求之前,首先检查黑名单中用户的IP(10次应该足够了)。如果允许IP,则检查请求的用户失败登录(5次应该是好的),如果其中一次检查失败,则发送一个质询并停止登录操作。
你可以使用安全的captcha或其他任何东西。如果客户端正确地解决了问题,请对其执行登录操作。并确保为用户重置错误的登录计数。但对于IP来说,不要立即进行,并每天、每周或每月重置。
因此,任何IP在错误登录10次后都应该面临挑战,在用户级别,任何IP地址在错误登录5次后都必须通过挑战
这样,你就不会给普通用户带来任何问题,也可以防止攻击者使用暴力。
在此之前
你应该考虑一下,如果:
- 两位同事在同一间办公室工作,拥有相同的IP地址。坏同事想从不同的电脑登录到他的同事的帐户,并连续3次登录失败。现在帐户所有者想要登录,在这种情况下你会怎么做
- 父亲和儿子在家,有相同的IP地址,儿子想从不同的电脑登录到他父亲的帐户,并连续3次登录失败。现在父亲想要登录,在这种情况下你会怎么做
有些用户有静态IP地址(他们无法更改)。
解决方案
因此,我会屏蔽该帐户和IP地址,然后我会向帐户所有者发送一封电子邮件,其中包含一个链接,该链接将解除对该帐户的锁定,而不需要更改密码。帐户所有者还应该回答有关IP地址去块的问题,因为他知道自己的IP地址。
如何操作(阻止IP地址)
优选的解决方案是在IP地址到达Node.JS之前,在较低级别屏蔽IP地址,因为所有网络都发生在操作系统内核中,内核可以比Node.JS更有效、更快地在连接中屏蔽它。
但首先要回答你的问题。。。
如何使用Node.JS阻止它
var blackList =
[
'77.88.99.1',
'88.77.99.1'
];
var http = require('http');
var server = http.createServer(function(req, res)
{
var ip = req.ip
|| req.connection.remoteAddress
|| req.socket.remoteAddress
|| req.connection.socket.remoteAddress;
if(blackList.indexOf(ip) > -1)
{
res.end(); // exit if it is a black listed ip
}
}).listen(80, '127.0.0.1');
Node.js的http.Server
有一个connection
事件。你也可以这样做:
server.on('connection', function(socket)
{
// console.log(socket.remoteAddress);
// Put your logic here
});
如何用Linux阻止它(例如)
有时需要阻止来自特定的远程主机。iptables是IPv4数据包的管理工具Linux内核下的过滤和NAT。以下提示将帮助您阻止攻击者或垃圾邮件发送者的IP地址。
如何阻止特定的传入ip地址
遵循iptable规则将删除来自主机/IP的传入连接
202.54.20.22
:iptables -A INPUT -s 202.54.20.22 -j DROP iptables -A OUTPUT -d 202.54.20.22 -j DROP
一个简单的shell脚本,用于阻止大量IP地址
如果你有很多IP地址,请使用以下shell脚本:
A) 创建文本文件:
# vi /root/ip.blocked
现在附加IP地址:
# Ip address block file 202.54.20.22 202.54.20.1/24 #65.66.36.87
B) 按如下方式创建脚本或将以下脚本行添加到现有脚本iptables外壳脚本:
BLOCKDB="/root/ip.blocked" IPS=$(grep -Ev "^#" $BLOCKDB) for i in $IPS do iptables -A INPUT -s $i -j DROP iptables -A OUTPUT -d $i -j DROP done
C) 保存并关闭文件。
©SourceLinux Iptables阻止对选定或特定ip地址的传入访问
我认为it用户在再次尝试登录时应该看到被阻止的消息。
由于来自同一IP地址的其他用户必须具有正确的凭据才能登录到系统。
这个逻辑似乎应该由负责登录的同一个组件来实现;否则将需要两个组件之间的一些通信。
如果登录检查是在Node.js服务器应用程序中执行的,那么它也是执行新检查的正确位置。
如果您在应用程序中使用Express,则可以使用Express ipfilter或类似的包来阻止ip访问。
简单的例子如下:
// Init dependencies
const express = require('express')
const ipfilter = require('express-ipfilter').IpFilter
// Blacklist the following IPs
const ips = ['127.0.0.1']
// Create the server
app.use(ipfilter(ips))
app.listen(3000)
您可以将ips列表存储在内存或Redis之类的存储中,并动态添加ips(例如,当用户连续3次登录失败时)。您可能还希望仅在特定时间段(例如一小时)内阻止ips。
您可以获取客户端的IP
const remoteAddresParams = req._remoteAddress.split(':');
const IP = remoteAddresParams[remoteAddresParams.length -1];
然后您可以创建自己的中间件,下面的代码可能不正确,但您已经明白了。
e-g
app.use((req, res, next) => {
const blockedIPs = ['1.1.1.1', '0.0.0.0'];
const remoteAddresParams = req._remoteAddress.split(':');
const clientIP = remoteAddresParams[remoteAddresParams.length -1];
isClientBlocked= blockedIPs.any(ip => ip.toString() === clientIP.toString());
res.status(403)
res.json({success: 0, message: 'you are blocked for some reason'})
});
`
在您的案例中为
阻止未能登录的用户
正确的方法是根本不这样做。
IP阻止更多的是关于DoS保护或法律要求。
- 用户可以从不同的IP登录
- 不同的用户可以从同一个IP登录
所以如果你通过IP 阻止
- 恶意用户只需更改即可
- 一个公平的用户将被无故阻止,你可以放松。。。根据你的情况。。。什么都没有或者相当多
(为什么要阻止IP而不是帐户?)
但如果你无论如何都想这么做,那么我想你问的不是"strong";如何"你确实应该这么做,但"在哪里">
我应该在服务器应用程序中处理阻塞部分吗,基本上是在用户连接但尚未登录之后,还是有一些较低级别的阶段应该由我来完成,所以它甚至无法到达我的nodejs应用程序?
好吧,这取决于情况。
- 在node.js服务器的代码中(有或没有一些第三方npm模块)更容易做到这一点,如果你只有这些代码,并且你的服务器不应该处理大量的请求
- 但是,如果您的服务器负载过重,或者您发现自己不时受到DoS攻击。然后,是的,最好是低级别,并将Nginx(或类似内容)添加到您的基础设施中。将ip地址列入黑名单
所以它甚至没有到达我的nodejs应用
- 如果您已经拥有Nginx,那么使用它的理由就更多了,而不是在技术细节上削弱您和服务器的性能,而是专注于业务逻辑。这也需要一些努力(见上面的链接),但这将是一个更稳健的解决方案
在用户连续3次登录失败后阻止IP地址不是一个好主意。因为
- 可以更改IP地址
- 您应用程序中帐户的原始所有者和试图猜测密码的人可能在同一网络上,因此,相同的IP地址
那么,在不阻止IP地址的情况下,您可以做些什么来提高应用程序的安全性呢?解决方案是
-
登录帐户失败后,当用户在3次尝试失败后尝试登录时,您可以开始显示reCaptcha。
-
如果用户名(或专门指向应用程序数据库中任何帐户的电子邮件)和发送有关更改密码以根据应用程序恢复帐户或其他内容的电子邮件,则可以暂时停用应用程序中用户的帐户。
还有一个阻止IP地址的想法,如果你真的想在3次尝试失败后博客IP地址,你可以执行以下步骤:
- 暂时阻止用户的IP地址。之后
- 向帐户所有者发送电子邮件,说明失败的尝试以及通过更改密码恢复帐户的方法
- 在3次尝试失败后,开始显示该特定IP地址或帐户的reCaptcha以登录,这样,如果IP地址也发生了更改,则会使进行点击和试用变得更加困难
检测到攻击后,首先想到的是阻止攻击者的IP地址。
IP阻止并不是防止用户在登录后出现错误次数的正确方法。
但这不是阻止攻击的好方法,因为:
- 攻击者可以通过动态更改IP地址轻松克服此问题
- 阻止一个公共IP可能会切断其他使用它的用户
有几种不同的安全技术可以阻止这种类型的攻击,
-
您可以管理用户帐户的失败登录日志,并根据您可以暂时停用用户帐户的情况,计算在过去N分钟内从同一IP进行的失败尝试次数。
-
登录帐户失败后,当用户在3次失败后尝试登录或添加安全问题时,您可以开始显示captcha。
-
向用户发送电子邮件,说明失败的尝试以及通过更改密码恢复帐户的方法。