mysql - 用于从给定 IP 进行错误登录锁定的 SQL

标签 mysql sql

我有一个表,其中存储(以及其他位)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

参见sqlfiddle

关于mysql - 用于从给定 IP 进行错误登录锁定的 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17041717/

相关文章:

php - 将 Instagram API 订阅保存在数据库中

php - 打开 SSH mysql Workbench 解决方法

java - MySql数据库访问JDBC驱动

sql - lsof 如果文件描述符已打开

mysql - 行在 View 中表示为列

MySQL 服务器检查约束范围

python - 在 SQLAlchemy 中映射大量相似的表

java - 在没有准备语句的 SQL 中转义字符

sql - 有没有办法保证 MySQL 中的非阻塞读取?

mysql - 在 MySQL 中插入时检查和防止相似的字符串