如果在任何 5 分钟的时间间隔内有 5 个错误,我想通过 IP 阻止所有请求,比方说 10 分钟。 我正在考虑一种以最不可能损害性能的方式存储这些数据的方法。
特别是如何设计数据库表和存储数据。
如果我为 IP 创建一个固定表作为主表,例如使用 mysql:
ip int(10) unsigned, primary key (ip)
attempts int(5),
lastaccess timestamp default current_timestamp
然后它会不充分地积累尝试......
另一方面,如果我用时间戳记录所有不正确的尝试,例如:
ip int(10) unsigned,
lastaccess timestamp default current_timestamp,
primary key (ip,lastaccess)
然后在 5 分钟的时间间隔内倒计时,表可能会随着所有这些数据变得非常庞大并减慢系统...它也需要维护。
那么,你能给我一些更方便的建议吗?...
最佳答案
我会存储 IP 地址和最后 x 次尝试的时间戳。无论是在数据库中,还是在 memcached 类型的存储中,或者可能只是一些平面文件,具体取决于您预期的流量。
如果是数据库,您可以轻松地查询类似 COUNT(timestamps) GROUP BY ip WHERE timestamp [within last 5 minutes]
并偶尔使用简单的 DELETE WHERE timestamp 清理数据库[5 分钟前]
。清理可能发生在 cron 作业中,也可能发生在垃圾收集系统中的每 x 个请求中。
如果像 memcached 或平面文件之类的东西,将时间戳存储在 FIFO 数组中,即一个简单的 array(123456..., 123456..., ...)
你不断截断.
关于PHP:一种存储登录尝试次数的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11644895/