Как посчитать velocity check в SQL

Закрепи формулу velocity check в Карьернике
Запомнить надолго — 5 коротких сессий с задачами на эту тему. Бесплатно
Тренировать velocity check в Telegram

Зачем 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.

Закрепи формулу velocity check в Карьернике
Запомнить надолго — 5 коротких сессий с задачами на эту тему. Бесплатно
Тренировать velocity check в Telegram

Пороги

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 сначала.

Связанные темы

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 периодически.