如何正确阻止Node.JS服务器应用程序中的IP地址?

如何解决如何正确阻止Node.JS服务器应用程序中的IP地址?

说我有一个Node.JS服务器应用程序,我想阻止连续3次登录失败的用户,正确的方法是什么?

我应该在服务器应用程序中处理阻塞部分,基本上是在用户连接但尚未登录之后,或者应该在较低级别的阶段执行该操作,因此它甚至无法达到我的要求Node.JS应用程序?

解决方法

您为什么要阻止用户?

作为安全研究人员,我将为您提供一个通用的答案,该答案不是针对 NodeJS 的。

IP阻止几乎无效,因为它可以轻松更改。

如果您阻止用户,攻击者可以通过强行迫使其他用户或特定用户禁用其帐户来破坏网站的部分可用性。

我个人使用挑战系统来满足这两个条件

  • 计算IP登录失败的尝试次数
  • 计算用户登录失败的次数

最后,在执行登录请求之前,请先检查黑名单中用户的IP(10次就足够了)。 如果允许该IP,则检查请求的用户登录失败(应该5次),并且如果其中一项检查失败,则发送回一个质询并停止登录操作。

您可以使用安全的验证码或其他任何方式。 如果客户端正确解决了问题,请为此执行登录操作。 并确保您为用户重置了错误的登录计数。 但是对于IP,请不要立即执行,而是每天,每周或每月重置一次。

因此,错误登录10次后的任何IP都应面临挑战,而使用任何IP地址进行5次错误登录后的用户级IP必须通过挑战

这样,您将不会对普通用户造成任何问题,也不会阻止攻击者强行攻击。

,

开始之前

您应该考虑在以下情况下会发生什么情况:

  1. 两个同事在同一办公室工作,并且拥有相同的IP地址。坏同事希望从其他PC登录到他的同事的帐户,并连续3次失败登录。现在,帐户所有者想要登录,在这种情况下您将如何处理?
  2. 父亲和儿子在家里,具有相同的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保护或法律要求有关。

  1. 用户可以从不同的IP登录。
  2. 不同的用户可以从同一IP登录。

所以,如果您被IP屏蔽

  1. 恶意用户只会对其进行更改。
  2. 公平用户将无缘无故被封锁,您可以根据自己的情况而放松……什么也没有很多。

(为什么还要阻止IP而不是帐户?)

但是,如果您仍然想这样做,那么我想您不是在问“如何?” ,而应该问的是“在哪里?”

基本上应该在用户连接但尚未登录后,还是在较低的阶段中,处理服务器应用中的阻止部分 应该这样做,所以它甚至都没有到达我的nodejs应用程序?

嗯,这取决于。

  1. 如果只有此代码,而您的服务器不应该处理大量请求,那么在node.js服务器的代码(带有或不带有某些第三方npm模块)中进行操作会更容易。
  2. li>
  3. 但是,如果服务器负载沉重,或者您确实不时遇到DoS攻击。然后,是的,最好降低级别,并向您的基础架构中添加 Nginx (或类似名称)。 blacklisting-ip-addresses

    因此它甚至无法到达我的nodejs应用

  4. 如果您已经拥有 Nginx ,那么有更多的理由使用它,而不是在技术上让您和您的服务器性能受到影响,而是专注于业务逻辑。这也需要一些努力(请参阅上面的链接),但这将是更可靠的解决方案。
,

在用户连续3次登录失败后阻止IP地址不是一个好主意。因为

  1. 可以更改一个IP地址。
  2. 您应用中帐户的原始所有者和尝试猜测密码的人可能在同一网络上,因此,相同的IP地址

那么,如何在不阻止IP地址的情况下提高应用程序的安全性呢?解决方法是

  1. 在无法登录帐户后,您可以在用户尝试3次失败后尝试登录时开始显示 reCaptcha

  2. 如果用户名(或专门指向您应用数据库中任何帐户的电子邮件)可以暂时停用您应用中用户的帐户,并发送电子邮件有关更改密码以根据您的应用程序恢复帐户或其他用途的信息。

如果您确实想在3次失败的尝试后将IP地址写为博客,则还有另一种方法来阻止IP地址,您可以执行以下步骤:

  1. 临时 阻止用户的 IP地址。之后,
  2. 向帐户所有者发送电子邮件,以说明失败的尝试以及通过更改密码来恢复帐户的方法。
  3. 尝试3次失败后,开始显示要登录的特定IP地址或帐户的 reCaptcha ,这样一来,如果IP地址也被更改,将使点击和试用变得更加困难。 / li>
,

检测到攻击后首先想到的是阻止攻击者的IP地址。

IP阻止不是阻止用户多次错误登录后的正确方法。

但这不是阻止攻击的好方法,因为:

  • 攻击者可以通过动态更改IP地址轻松地克服这一点
  • 阻止公共IP可能会切断使用该IP的其他用户

有几种不同的安全技术可以阻止此类攻击,

  1. 您可以管理一个用户帐户登录失败的日志,并根据您可以暂时停用该用户帐户的方式,计算在最近N分钟内从同一IP进行的失败尝试次数。

  2. 无法登录帐户后,如果用户在3次失败后尝试登录或添加安全性问题,则可以开始显示验证码。

  3. 向用户发送有关尝试失败的电子邮件以及通过更改密码来恢复帐户的方法。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-