2009-09-13 62 views
1

好的,你有登录表单,如果他们的密码/用户错误,你想禁止用户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() 
+0

问题在哪里? – McAden 2009-09-13 03:18:49

+0

添加了问题。我认为已经很明显:) – raspi 2009-09-13 03:25:50

回答

1

你的问题是漫长的,我承认,我挣扎,苦苦思索你在问什么。我相信你问:如果我检查“最近X分钟内有多少次失败?”那么锁定只会持续到最近的故障失败;我如何确保它始终持续5分钟?

如果这就是你要求的,那么这里是一个相当简单的方法:在每次登录失败时,询问数据库“最近X分钟内有多少失败?”。如果这些数据加上失败的数据是3或更多,那么在用户的数据库行中设置一个列 - 例如locked_until,现在为+5分钟。

现在,修改您的登录代码以首先检查帐户是否被锁定。

+0

是的,这就是我想问的。但不是用户帐户,而是IP地址。 – raspi 2009-09-13 03:59:33

+0

同一主体。只需使用锁定时间戳创建IP地址的锁定记录即可。 – derobert 2009-09-13 16:33:31

2

正如我从你的长问题中所了解的那样,你需要知道一个IP将被禁止或不能在最后$ time_for_ban_try尝试失败。那么你可以尝试以下各项

$ time_for_ban_try = 10; //分钟,例如

$ SQL =“SELECT IF(COUNT(ID)< 3, '假', '真')AS is_banned FROM LOGIN_FAILS WHERE ipaddress ='1.2.3.4'并添加了BETWEEN(NOW() - INTERVAL $ time_for_ban_try MINUTE)和NOW NOW()“;

如果我错了,请让我知道。

1

Memcache非常适合这类事情,并且与数据库表相比,将为您的系统带来更少的开销(以及更少的代码)。您可以通过设置IP-> #_ of_failures的key-> value对来计算登录失败次数,并将其缓存数秒钟,以便跟踪登录失败。如果值(失败次数)太高,则为该IP缓存一个唯一的“禁用”值,持续5分钟。

请注意一个事实,即禁止用户进行登录失败是非常烦人,如果你这样做,你应该设置故障所允许的数量是非常。用户通常会有一组密码(按照“重要性”排列),如果他们忘记密码,他们会尝试在您的网站上使用它们。

也要注意多人可能会使用相同的IP(如在大学校园或私人网络上)。

+0

+1最后的评论。 NAT和网络代理非常普遍。 (例如美国在线是一个大代理) 1个地址并不总是= 1个用户。 – txyoji 2009-09-13 13:26:39