我不希望服务器被暴力强迫但我不想使用CAPTCHA,因为他们不是用户友好/我不想依赖另一家公司 - 因为我不打算实现我自己的验证码系统。
我想过用这种结构创建一个attempts
表:
________________________________________________________________
| IP | ATTEMPTS | LOCK |
|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾|
| 1.1.1.1 | 0 | 2 |
| .... | .... | .... |
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ Yes I had fun making this
让用户有5-10次尝试,然后重置为0和 将锁定时间增加2倍 - 以分钟为单位。
这是一种锁定蛮力的好方法吗?
我的服务器上有这样的逻辑: - 抽象
....
* on request to server do below *
db.query("SELECT * FROM attempts WHERE IP= *REQUEST.IP* ",function(result){
if (result.rows.length > 0 && result.rows[0].attempts > 5) {
if (CheckIfExpired(results.rows[0].lock)) {
if (loginFail) MultplyLockBy2();
else RemoveFromAttemptsTable();
} else res.status("403").send("You're locked out");
} else normalLoginAttempt().ifFal(add1toAttempts());
....
我觉得有一种更有效的方法在SQL中本地执行此操作,我是SQL的新手。 (我正在使用postgresql)。
看了这个之后我猜我还需要一个开始时间字段,所以我可以计算锁定何时到期。
ASP.net + Njinx / Apache + sessions + ...!= node.js + sql
答案 0 :(得分:0)
使用fail2ban
。您的HTTP请求应该返回401(未经授权),并且您的fail2ban过滤器应该与连续401的access_log匹配,并禁止呼叫者持续10分钟左右(在IP防火墙级别)。
正如您所注意到的,答案与SQL,postgresql和nodejs无关。