sql - 如何使用 SQL 锁定登录尝试

标签 sql node.js postgresql security captcha

我不想被服务器暴力破解,但我不想使用验证码,因为它们对用户不友好/我不想依赖另一家公司 - 因为我不会实现我自己的验证码系统。

我想过用这种结构创建一个 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/

相关文章:

sql - 如何使postgresql结果唯一

php - MySQL PHP - fatal error ,查询在页面上失败但不是 PHPMyAdmin

Mysql - 来自 VIEW 的 "EXPLAIN SELECT"正在查看主表的所有行

javascript - 如何在 Node.js 中正确创建 Promise

javascript - Express - 无法连接到 MongoDB 服务器

sql - 优化 ActiveRecord 查询

sql - CockroachDB 中的 TEXT、CHAR 和 VARCHAR 有什么区别?

MySQL在时间轴上选择最小值、最大值

javascript - 有没有办法在 Javascript 中说 collection[attr1=value].attr2=value ?

c# - Entity Framework Core Postgres ILike 函数