如何解决如何正确阻止Node.JS服务器应用程序中的IP地址?
说我有一个Node.JS服务器应用程序,我想阻止连续3次登录失败的用户,正确的方法是什么?
我应该在服务器应用程序中处理阻塞部分,基本上是在用户连接但尚未登录之后,或者应该在较低级别的阶段执行该操作,因此它甚至无法达到我的要求Node.JS应用程序?
解决方法
您为什么要阻止用户?
作为安全研究人员,我将为您提供一个通用的答案,该答案不是针对 NodeJS 的。
IP阻止几乎无效,因为它可以轻松更改。
如果您阻止用户,攻击者可以通过强行迫使其他用户或特定用户禁用其帐户来破坏网站的部分可用性。
我个人使用挑战系统来满足这两个条件
- 计算IP登录失败的尝试次数
- 计算用户登录失败的次数
最后,在执行登录请求之前,请先检查黑名单中用户的IP(10次就足够了)。 如果允许该IP,则检查请求的用户登录失败(应该5次),并且如果其中一项检查失败,则发送回一个质询并停止登录操作。
您可以使用安全的验证码或其他任何方式。 如果客户端正确解决了问题,请为此执行登录操作。 并确保您为用户重置了错误的登录计数。 但是对于IP,请不要立即执行,而是每天,每周或每月重置一次。
因此,错误登录10次后的任何IP都应面临挑战,而使用任何IP地址进行5次错误登录后的用户级IP必须通过挑战
这样,您将不会对普通用户造成任何问题,也不会阻止攻击者强行攻击。
,开始之前
您应该考虑在以下情况下会发生什么情况:
- 两个同事在同一办公室工作,并且拥有相同的IP地址。坏同事希望从其他PC登录到他的同事的帐户,并连续3次失败登录。现在,帐户所有者想要登录,在这种情况下您将如何处理?
- 父亲和儿子在家里,具有相同的IP地址,儿子想要从其他PC登录到父亲的帐户,并连续3次失败登录。现在父亲想登录,在这种情况下您会怎么做?
有些用户拥有静态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 shell脚本:
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)保存并关闭文件。
©来源Linux Iptables block incoming access to selected or specific ip address
我认为该用户在再次尝试登录时应该会看到被阻止的消息。
作为其他来自具有相同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而不是帐户?)
但是,如果您仍然想这样做,那么我想您不是在问“如何?” ,而应该问的是“在哪里?”
基本上应该在用户连接但尚未登录后,还是在较低的阶段中,处理服务器应用中的阻止部分 应该这样做,所以它甚至都没有到达我的nodejs应用程序?
嗯,这取决于。
- 如果只有此代码,而您的服务器不应该处理大量请求,那么在node.js服务器的代码(带有或不带有某些第三方npm模块)中进行操作会更容易。 li>
- 但是,如果服务器负载沉重,或者您确实不时遇到DoS攻击。然后,是的,最好降低级别,并向您的基础架构中添加 Nginx (或类似名称)。 blacklisting-ip-addresses
因此它甚至无法到达我的nodejs应用
- 如果您已经拥有 Nginx ,那么有更多的理由使用它,而不是在技术上让您和您的服务器性能受到影响,而是专注于业务逻辑。这也需要一些努力(请参阅上面的链接),但这将是更可靠的解决方案。
在用户连续3次登录失败后阻止IP地址不是一个好主意。因为
- 可以更改一个IP地址。
- 您应用中帐户的原始所有者和尝试猜测密码的人可能在同一网络上,因此,相同的IP地址。
那么,如何在不阻止IP地址的情况下提高应用程序的安全性呢?解决方法是
-
在无法登录帐户后,您可以在用户尝试3次失败后尝试登录时开始显示 reCaptcha 。
-
如果用户名(或专门指向您应用数据库中任何帐户的电子邮件)可以暂时停用您应用中用户的帐户,并发送电子邮件有关更改密码以根据您的应用程序恢复帐户或其他用途的信息。
如果您确实想在3次失败的尝试后将IP地址写为博客,则还有另一种方法来阻止IP地址,您可以执行以下步骤:
- 临时 阻止用户的 IP地址。之后,
- 向帐户所有者发送电子邮件,以说明失败的尝试以及通过更改密码来恢复帐户的方法。
- 尝试3次失败后,开始显示要登录的特定IP地址或帐户的 reCaptcha ,这样一来,如果IP地址也被更改,将使点击和试用变得更加困难。 / li>
检测到攻击后首先想到的是阻止攻击者的IP地址。
IP阻止不是阻止用户多次错误登录后的正确方法。
但这不是阻止攻击的好方法,因为:
- 攻击者可以通过动态更改IP地址轻松地克服这一点
- 阻止公共IP可能会切断使用该IP的其他用户
有几种不同的安全技术可以阻止此类攻击,
-
您可以管理一个用户帐户登录失败的日志,并根据您可以暂时停用该用户帐户的方式,计算在最近N分钟内从同一IP进行的失败尝试次数。
-
无法登录帐户后,如果用户在3次失败后尝试登录或添加安全性问题,则可以开始显示验证码。
-
向用户发送有关尝试失败的电子邮件以及通过更改密码来恢复帐户的方法。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。