Как посчитать velocity check в SQL
Содержание:
Зачем velocity check
Velocity — скорость событий: сколько транзакций пользователь делает в минуту/час/день. Резкие всплески обычно означают automated abuse: bot, credential stuffing, cards testing. Простой rule, который ловит 70% обычного fraud без ML.
Окна
Стандартный набор:
- 1 минута — captcha bypass, mass signup
- 5 минут — card testing
- 1 час — burn rate
- 24 часа — daily limit
Velocity в SQL
Для каждого юзера за разные окна:
SELECT
user_id,
COUNT(*) FILTER (WHERE created_at >= NOW() - INTERVAL '1 minute') AS last_1_min,
COUNT(*) FILTER (WHERE created_at >= NOW() - INTERVAL '5 minutes') AS last_5_min,
COUNT(*) FILTER (WHERE created_at >= NOW() - INTERVAL '1 hour') AS last_1_hour,
COUNT(*) FILTER (WHERE created_at >= NOW() - INTERVAL '24 hours') AS last_24_hour
FROM transactions
WHERE created_at >= NOW() - INTERVAL '24 hours'
GROUP BY user_id
ORDER BY last_1_min DESC, last_5_min DESC
LIMIT 50;Юзеры в top — кандидаты на review.
Velocity по IP
Sometimes fraud распределяется по multiple user accounts с одного IP:
SELECT
ip,
COUNT(*) AS transactions,
COUNT(DISTINCT user_id) AS unique_users,
COUNT(DISTINCT card_id) AS unique_cards
FROM transactions
WHERE created_at >= NOW() - INTERVAL '1 hour'
GROUP BY ip
HAVING COUNT(*) > 10
ORDER BY transactions DESC;1 IP, 50 транзакций, 30 cards = highly suspicious.
Пороги
WITH velocity AS (
SELECT
user_id,
COUNT(*) FILTER (WHERE created_at >= NOW() - INTERVAL '5 minutes') AS v5
FROM transactions
GROUP BY user_id
)
SELECT
user_id,
v5,
CASE
WHEN v5 > 20 THEN 'block'
WHEN v5 > 10 THEN 'review'
WHEN v5 > 5 THEN 'flag'
ELSE 'ok'
END AS action
FROM velocity
WHERE v5 > 5;Калибровать по historical: какие velocities были у проверенных fraud cases.
Частые ошибки
Ошибка 1. Threshold для всех одинаков. Power user может делать 50 actions/min нормально. SMB customer — 1. Сегментируйте по persona.
Ошибка 2. Считать только current window. Smart attacker делает 9 транзакций per minute, чтобы не triggered threshold 10. Используйте multiple windows.
Ошибка 3. Не различать types. 10 logins за минуту — normal browse. 10 charges — fraud. Разные пороги.
Ошибка 4. Игнорировать device/IP velocity. 1 user — 1 transaction. 1 IP — 100 user signups с разных аккаунтов. Velocity на разных уровнях.
Ошибка 5. Реагировать без manual review. Auto-block на velocity = false positives. Manual review сначала.
Связанные темы
- Как посчитать fraud score в SQL
- Как посчитать IP velocity в SQL
- Как посчитать fraud rate в SQL
- Как посчитать anomaly detection в SQL
FAQ
Какие окна важнее?
1-5 минут для real-time abuse. 1-24 часа для card testing.
Velocity vs rate limit?
Velocity — analytics-метрика. Rate limit — enforcement через API gateway.
False positives?
Конечно. Power users, мобильные синхронизации. Whitelist + manual review.
Velocity для signups?
Да — стандарт против массовой регистрации. 5/min с одного IP — блок.
Можно ли в real-time?
В SQL медленно. Кешируйте в Redis, sync в DB периодически.