PHP:一种存储登录尝试次数的方法?

标签 php mysql sql security

如果在任何 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/

相关文章:

python - 如何像使用 Python 一样使用 SQL,通过复制行同时更改该行中的一个值(其中该值源自不同的列)?

php - ApnsPHP 无法连接到 Apple 网关

javascript - 在 yii 中使用 ajax 将变量从 javascript 传递到 PHP

php 图片显示问题

mysql - Sequelize 创建并填充foreignKey

innodb - MySQL InnoDB : cannot calculate statistics because the . ibd 文件丢失

mysql - 即使未找到该行,如何在搜索特定数量的行后完成我的 MySQL 提取?

mysql - 有条件地显示 MySQL 存储过程中查询的一部分

php - 在 HTMl 和 PHP 中向表单添加字段

php - 从表中排序数据,分配给变量然后从另一个文件调用