Ale*_*lex 7 javascript security networking node.js
假设我有一个 Node.JS 服务器应用程序,我想阻止连续 3 次登录失败的用户,正确的方法是什么?
我应该在服务器应用程序中处理阻塞部分,基本上是在用户连接但尚未登录之后,还是有一些我应该做的较低级别的阶段,所以它甚至没有到达我的 Node.JS应用程序?
为什么要阻止用户?
作为一名安全研究员,我会给你一个一般性的答案,而不是NodeJS 的特殊性。
IP 阻止几乎无效,因为它可以轻松更改。
如果您阻止用户,攻击者可以通过强制其他用户或特定用户禁用他们的帐户来轻松破坏您网站的部分可用性。
我个人使用挑战系统来涵盖这两种情况
最后,在进行登录请求之前,首先检查用户的IP,在您的黑名单中(10 次应该足够了)。如果 IP 被允许,则检查请求的用户登录失败(5 次应该是好的),如果这些检查之一失败,则发送回挑战并停止登录操作。
您可以使用安全验证码或其他任何东西。如果客户端正确解决,则对其进行登录操作。并确保为用户重置不正确的登录计数。但是对于 IP,不要立即执行并每天、每周或每月重置它。
所以,10次错误登录后的任何IP都应该面临挑战,并且在5次错误登录任何IP地址后的用户级别必须通过挑战
这样,您就不会对普通用户造成任何问题,也不会阻止攻击者进行暴力破解。
您应该考虑在以下情况下会发生什么:
并且一些用户拥有静态 IP 地址(他们无法更改它)。
解决方案
因此,我会阻止帐户和 IP 地址,然后我会向帐户所有者发送一封电子邮件,其中包含一个链接,该链接将取消阻止帐户,而无需更改密码。帐户所有者还应该回答有关解除 IP 地址封锁的问题,因为他知道自己的 IP 地址。
更好的解决方案是在较低级别阻止 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');
Run Code Online (Sandbox Code Playgroud)
Node.jshttp.Server有一个connection事件。你也可以这样做:
server.on('connection', function(socket)
{
// console.log(socket.remoteAddress);
// Put your logic here
});
Run Code Online (Sandbox Code Playgroud)
有时需要阻止来自特定远程主机的传入连接或流量。iptables 是 Linux 内核下 IPv4 包过滤和 NAT 的管理工具。以下提示将帮助您阻止攻击者或垃圾邮件发送者的 IP 地址。
如何阻止特定的传入 IP 地址?
以下 iptable 规则将丢弃来自 host/IP 的传入连接
202.54.20.22:Run Code Online (Sandbox Code Playgroud)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) 创建一个文本文件:
Run Code Online (Sandbox Code Playgroud)# vi /root/ip.blocked现在附加IP地址:
Run Code Online (Sandbox Code Playgroud)# Ip address block file 202.54.20.22 202.54.20.1/24 #65.66.36.87B) 按如下方式创建脚本或将以下脚本行添加到现有的 iptables shell 脚本中:
Run Code Online (Sandbox Code Playgroud)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 doneC) 保存并关闭文件。
© Source Linux Iptables 阻止对选定或特定 IP 地址的传入访问
| 归档时间: |
|
| 查看次数: |
4224 次 |
| 最近记录: |