我不想被服务器暴力破解,但我不想使用验证码,因为它们对用户不友好/我不想依赖另一家公司 - 因为我不会实现我自己的验证码系统。
我想过用这种结构创建一个 attempts
表:
________________________________________________________________
| IP | ATTEMPTS | LOCK |
|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾|
| 1.1.1.1 | 0 | 2 |
| .... | .... | .... |
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ Yes I had fun making this
在重置为 0 之前让用户尝试 5-10 次 将锁定时间增加 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 + session + ... != node.js + sql
最佳答案
使用fail2ban
.您的 HTTP 请求应返回 401(未经授权),并且您的 fail2ban 过滤器应与连续 401 的 access_log 相匹配,并禁止调用者 10 分钟左右(在 IP 防火墙级别)。
如您所见,答案与 SQL、postgresql 或 nodejs 无关。
关于sql - 如何使用 SQL 锁定登录尝试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39924666/