Хорошо, у вас есть форма для входа и вы хотите забанить пользователей на 5 минут, если они неправильно введут пароль / пользователя.
Пользователь может попробовать несколько раз подряд, пока его не забанят.
Таблица LOGIN_FAILS:
- id PK, serial / auto_increment
- ipaddress int / text / что угодно
- добавлено 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();
Это можно представить как
Блокировка чека по времени: #####
Сбои: 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()