-->

IP黑名单的PHP + MySQL的(IP Blacklist in PHP+MySQL)

2019-07-31 18:06发布

我一直在努力实现一种在PHP中,在那里我失败的登录尝试存储到一个MySQL表与下面的架构IP黑名单的:

CREATE TABLE blacklist(
    `ip_address` VARCHAR(35) NOT NULL,
    `failures` INTEGER DEFAULT 0,
    `release_time` BIGINT DEFAULT -1,
    PRIMARY KEY(`ip_address`)
);

在我登录检查,我先删除与下面的查询具有在当前时间之前释放时间(如果释放时间已经过去了)任何黑名单条目:

/* I pass in time() */
DELETE FROM failures WHERE release_time < ?;

然后我执行以下命令:

/* I pass in $_SERVER['REMOTE_ADDR'] */
SELECT failures FROM blacklist WHERE ip_address=?

如果我没有找回行或如果$行[“失败”],我回去超过5,我允许用户名和密码的检查。 否则,我完全拒绝登录。

对于每一个失败的登录尝试(无论是通过一个黑名单规则,或者通过一个无效的用户名/密码),我执行:

/* IP address is $_SERVER['REMOTE_ADDR'],
   release_time is current time + (new failures * 90 minutes) */
INSERT INTO BLACKLIST(ip_address, failures, release_time) VALUES(?,?,?) 
ON DUPLICATE KEY UPDATE failures=failures+1, release_time=?;

不幸的是,我打数据库中至少3次(清黑名单,得到一个IP地址,增加故障为最小)。 有没有更好的方式来维持一个动态的黑名单,也许写高速缓存的每一分钟?

我也看到, 通过IP与PHP / MySQL的禁止类似我的问题,但我允许从黑名单,如果他们停止尝试一段很好的时期登录被删除的人。 这样一来,人们谁只是忘记了自己凭证的影响比人们试图暴力破解的方式进入获得证书更少。

Answer 1:

下面的查询并不需要定期运行,并且可以移动到cron作业:

DELETE FROM failures WHERE release_time < ?;

这种“布尔”查询将返回1,如果该人被列入黑名单,否则为0:

SELECT
  COUNT(ip_address) as blacklisted
FROM blacklist
WHERE
  ip_address = ? AND
  release_time > ? AND
  failures > 5

这可能加快速度为您不使用PHP来计算行和比较数字:

if ($row['blacklisted']) { /* ... */ }

我不认为你能避免最后一个真的。



文章来源: IP Blacklist in PHP+MySQL