gpt4 book ai didi

php - PHP+MySQL 中的 IP 黑名单

转载 作者:行者123 更新时间:2023-11-29 14:16:52 26 4
gpt4 key购买 nike

我一直在尝试在 PHP 中实现一种 IP 黑名单,我将失败的登录尝试存储到具有以下架构的 MySQL 表中:

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=?

如果我没有检索到任何行,或者如果我返回的 $row['failures'] 超过 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 地址、以最少的失败次数递增)。有没有更好的方法来维护动态黑名单,也许每分钟写入缓存?

我确实看到了Banning by IP with php/mysql与我的问题类似,但如果人们在一段时间内停止尝试登录,我允许他们从黑名单中删除。这样,那些忘记凭证的人所受到的影响就比那些试图通过暴力获取凭证的人受到的影响要小。

最佳答案

以下查询不需要定期运行,可以移至 cron 作业:

DELETE FROM failures WHERE release_time < ?;

如果此人被列入黑名单,此“ bool ”查询将返回 1,否则返回 0:

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

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

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

我认为你真的无法避免最后一个。

关于php - PHP+MySQL 中的 IP 黑名单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12513727/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com