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/

相关文章:

javascript - 为什么 Jest 在没有标志 --runInBand 的情况下会失败?

javascript - session 不是持久的 [PASSPORT]

python - Matlab 检查数据库中的值

SQL 多个 OR BETWEENS

mysql - 按日期订购 2 张 table

mysql - 寻找替代 SQL 命令以在两个表中查找相同的值

mysql - 使用 node-mysql 创建同步查询

php - 从多表 SQL 中获取值

sql - 如何确定给定标准的连续范围的大小?

sql - 从 sequelize 中的多个表中选择