好的,你有登录表单,如果他们的密码/用户错误,你想禁止用户5分钟。 用户可以连续尝试几次,直到被禁止。正在做临时禁止
LOGIN_FAILS表:
- ID PK,串行/ AUTO_INCREMENT
- ip地址INT /文本/不管你喜欢
- 添加DATETIME/TIMESTAMP
SQL:
SELECT IF(COUNT(id) < 3, 'false', 'true') AS is_banned FROM LOGIN_FAILS WHERE ipaddress='1.2.3.4' AND added BETWEEN (NOW() - INTERVAL '5 minutes') AND NOW();
这可以是vi sualized作为
班检查timeblock:#####
失败:1,2,3
失败都设置为时间范围:
Time ->
========1==2=3==========
========######==========
现在你可以一次再试一次在一排:
========1######=========
现在你可以连续两次再试一次:
========1==2######======
但正确的做法将举行5分钟
该区间========######==========
现在,您可以三次尝试再次连续
========1==2=3######====
^^^^^^ Ignored
但你不希望使用当前时间作为块(0:00-0:05,0:05-0:10等),因为如果禁令在0:04发生,则下一个禁止检查时间块为0:05(=仅禁止1分钟)。
那么必须对给定的SQL语句添加/修改什么,以便用户可以总是连续尝试N次,然后暂时禁止X分钟?
编辑
因此,像
SELECT
IF(COUNT(id) < 3, 'false', 'true') AS is_banned
FROM
LOGIN_FAILS
WHERE
ipaddress='1.2.3.4' AND
added
BETWEEN
(
SELECT
MIN(added) AS min
FROM
LOGIN_FAILS
WHERE
ipaddress='1.2.3.4' AND
added <= (NOW() - INTERVAL 5 minutes)
ORDER BY
added
LIMIT 3
)
AND
NOW()
问题在哪里? – McAden 2009-09-13 03:18:49
添加了问题。我认为已经很明显:) – raspi 2009-09-13 03:25:50