mysql - группировка по INTERVAL 1 HOUR (обнаружение подозрительных массовых входов в систему) - PullRequest
0 голосов
/ 08 мая 2018

Я хочу узнать, какие пользователи чаще всего входят в систему за один час. Я записываю всю активность в таблицу с именем user_activity, в которой есть столбцы event_class, timestamp и user_id (другие существуют, но не имеют значения). Когда пользователь входит в систему, класс событий LOGIN записывается вместе с CURRENT_TIMESTAMP против их user_id.

На сервере выполняется конкурентная регистрация в университетских событиях, и учащиеся, решающие CAPTCHA (Python / OpenCV2 ...), были обнаружены в прошлом, когда я видел сотни login событий в течение часа или около того для одного пользователя ( см. Ниже ). Я сделал скрипт, чтобы временно запретить пользователям входить в систему более 5 раз за последние десять минут, что достаточно просто.

Теперь я хочу выполнить поиск в исторических записях, чтобы увидеть общее количество входов в систему на пользователя в течение одного часа. В псевдо-говорить: «select each user_id from user_activity and group by total logins per last interval 1 hour», чтобы я мог быстро увидеть, какие пользователи и IP-адреса (не показаны) быстро войти в систему. Можно ли это сделать?

Пример последних 30 логинов "Шона" перед тем, как мы его забанили

+---------+-------------+---------------------+ | user_id | event_class | timestamp | +---------+-------------+---------------------+ | 617 | LOGIN | 2018-05-01 21:46:20 | | 617 | LOGIN | 2018-05-01 20:48:55 | | 617 | LOGIN | 2018-05-01 20:45:01 | | 617 | LOGIN | 2018-05-01 20:43:41 | | 617 | LOGIN | 2018-05-01 20:42:06 | | 617 | LOGIN | 2018-05-01 20:37:19 | | 617 | LOGIN | 2018-05-01 20:32:31 | | 617 | LOGIN | 2018-05-01 20:27:17 | | 617 | LOGIN | 2018-05-01 20:26:21 | | 617 | LOGIN | 2018-05-01 20:25:44 | | 617 | LOGIN | 2018-05-01 20:24:08 | | 617 | LOGIN | 2018-05-01 20:20:44 | | 617 | LOGIN | 2018-05-01 20:16:59 | | 617 | LOGIN | 2018-05-01 18:23:44 | | 617 | LOGIN | 2018-05-01 13:01:14 | | 617 | LOGIN | 2018-05-01 12:55:12 | | 617 | LOGIN | 2018-05-01 12:47:58 | | 617 | LOGIN | 2018-04-30 16:09:51 | | 617 | LOGIN | 2018-04-30 15:38:22 | | 617 | LOGIN | 2018-04-30 15:37:31 | | 617 | LOGIN | 2018-04-30 15:36:20 | | 617 | LOGIN | 2018-04-30 15:35:33 | | 617 | LOGIN | 2018-04-30 15:34:08 | | 617 | LOGIN | 2018-04-30 15:31:46 | | 617 | LOGIN | 2018-04-30 15:24:33 | | 617 | LOGIN | 2018-04-30 15:23:22 | | 617 | LOGIN | 2018-04-30 15:20:27 | | 617 | LOGIN | 2018-04-30 15:09:49 | | 617 | LOGIN | 2018-04-30 15:05:59 | | 617 | LOGIN | 2018-04-30 15:00:03 | +---------+-------------+---------------------+

1 Ответ

0 голосов
/ 08 мая 2018

Конечно, вы можете просто выбрать нужные данные и сгруппировать их следующим образом:

SELECT
    user_id,
    CONCAT(DATE(`timestamp`), ' ', HOUR(`timestamp`)) AS datehour,
    COUNT(1) AS logins
FROM user_activity
WHERE event_class = 'LOGIN'
GROUP BY user_id, datehour
HAVING logins > 5

Здесь мы должны увидеть строку для каждого пользователя, который входил в систему более 5 раз в течение каждого часа.Единственное предостережение в том, что это за час , поэтому, если они войдут в систему 3 раза в 22:59 и еще 3 раза в 23:01, у них не будет более 3 попыток в течение определенного часа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...