我有一个表,其中存储(以及其他位)IP 地址、*日期* 和序列号 PK每次尝试登录我的网站。
登录表:logref SERIAL、ipaddress CHAR(20)、logtime DATETIME、logresult (BOOL)(1=成功)
我想做的是,在最后一次有效登录之后,计算给定时间范围内每个 IP 地址的 false
或不正确登录的次数IP 地址。
到目前为止我所拥有的是:
SELECT ipaddress FROM logon
WHERE logref>=
(
SELECT MIN(logref) FROM logon WHERE
TIMESTAMPDIFF( HOUR , logtime,'2013-06-10 22:00:00' )<12
)
AND logresult=0
GROUP BY ipaddress
这为我提供了尝试失败登录的所有 IP 地址的列表。
我一直在尝试将其与另一个 SQL 合并:
SELECT COUNT( logref ) AS count
FROM logon
WHERE logname = '$user'
AND TIMESTAMPDIFF( HOUR ,logtime,'$timenow')<=$locktime
AND logref>(SELECT logref FROM logon
WHERE logname = '$user'
AND logresult='1'
ORDER BY logtime DESC LIMIT 1)
它可以很好地计算给定用户在 $locktime 内尝试登录失败的次数。
遗憾的是,我对子查询还很陌生,并且在尝试嵌套它们时迷失了方向。
本质上,我的想法是,我应该能够计算每个 IP 的错误登录次数,以降低拒绝服务攻击和计算机化登录猜测攻击的风险。
在这种情况下,Recaptcha 等不是可行的解决方案 - 它必须只是日志名/密码组合。
由于 NAT 的原因,很多人会从同一个 IP 地址登录,仅锁定过去 x 小时内具有给定数量的虚假 IP 是不够的,确实需要在出现错误的情况下进行自上次正确登录以来的特定数量。
白名单不起作用,因为可能有很多人从多个 IP 进行访问 - 尽管大多数登录将来自工作场所,但也有一些来自家庭。
我会自动将任何具有 12 个(或您建议的更好数字)或更多失败登录且没有正确登录的 IP 地址列入黑名单。
任何评论:
当没有恶作剧发生时,给定 IP 可能会出现多少次失败登录(初始安全参数指南)
是否有更好的方法来做到这一点。
在给定 IP 地址被自动锁定之前,应允许在没有良好登录的情况下进行多少次失败登录。
这种方案经常惹恼真正的用户
我将不胜感激,因为,当然,这将是我棘手的 SQL 问题的解决方案。
最佳答案
通过 IP 地址找出最近一次成功登录
SELECT
max(logref) max_logref,
ipaddress
FROM logon
WHERE logresult = TRUE
GROUP BY ipaddress
已更新
这将为您提供在时间范围(最后一天)内没有良好登录的登录信息
SELECT
ipaddress,
count(*)
FROM
logon
WHERE logtime > date_sub(now(), interval 1 day)
GROUP BY ipaddress
having max(logresult) = false
然后您可以计算出错误登录计数
SELECT
logon.ipaddress,
count(*) bad_logins
FROM
logon
JOIN (
SELECT
max(logref) max_logref,
ipaddress
FROM logon
WHERE logresult = TRUE
AND logtime > date_sub(now(), interval 1 day)
GROUP BY ipaddress
) good
ON
logon.ipaddress = good.ipaddress and
logon.logref > good.max_logref
GROUP BY
logon.ipaddress
UNION
SELECT
ipaddress,
count(*)
FROM
logon
WHERE logtime > date_sub(now(), interval 1 day)
GROUP BY ipaddress
having max(logresult) = false
关于mysql - 用于从给定 IP 进行错误登录锁定的 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17041717/