如何使用SQL锁定登录尝试

时间:2016-10-07 19:38:25

标签: sql node.js postgresql security captcha

我不希望服务器被暴力强迫但我不想使用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

1 个答案:

答案 0 :(得分:0)

使用fail2ban。您的HTTP请求应该返回401(未经授权),并且您的fail2ban过滤器应该与连续401的access_log匹配,并禁止呼叫者持续10分钟左右(在IP防火墙级别)。

正如您所注意到的,答案与SQL,postgresql和nodejs无关。