我一直在努力实现一种在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的禁止类似我的问题,但我允许从黑名单,如果他们停止尝试一段很好的时期登录被删除的人。 这样一来,人们谁只是忘记了自己凭证的影响比人们试图暴力破解的方式进入获得证书更少。