Как посчитать device fingerprinting в SQL

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

Зачем fingerprinting

Если юзер удалил аккаунт и создал новый ради trial bonus — fingerprinting ловит. То же для мульти-аккаунтов в abuse refer-a-friend, gaming, voting. Уникальный отпечаток устройства (user-agent + screen + timezone + fonts) обычно достаточно стабилен, чтобы matchить sessions.

Поля для отпечатка

Стандарт:

  • user_agent (browser + OS)
  • screen_resolution
  • timezone
  • language
  • canvas hash
  • WebGL renderer
  • audio fingerprint
  • installed fonts

Server-side: ip, asn, geo (но IP легко изменить через VPN).

Fingerprint в SQL

Хэшируем concatenation:

SELECT
    user_id,
    session_id,
    MD5(
        COALESCE(user_agent, '') || '|' ||
        COALESCE(screen_resolution, '') || '|' ||
        COALESCE(timezone, '') || '|' ||
        COALESCE(language, '') || '|' ||
        COALESCE(canvas_hash, '')
    ) AS device_fingerprint
FROM session_events
WHERE created_at >= CURRENT_DATE - INTERVAL '30 days';

MD5 достаточно для матчинга. Для cryptographic нужд — SHA256.

Multiple accounts на одном device

WITH fingerprints AS (
    SELECT
        user_id,
        MD5(
            COALESCE(user_agent, '') || '|' ||
            COALESCE(screen_resolution, '') || '|' ||
            COALESCE(timezone, '')
        ) AS fp
    FROM session_events
    WHERE created_at >= CURRENT_DATE - INTERVAL '30 days'
)
SELECT
    fp AS device_fingerprint,
    COUNT(DISTINCT user_id) AS accounts,
    ARRAY_AGG(DISTINCT user_id) AS user_ids
FROM fingerprints
GROUP BY fp
HAVING COUNT(DISTINCT user_id) > 3
ORDER BY accounts DESC;

> 3 accounts на одном fingerprint за месяц — flag. Может быть legit (family, shared office), но review нужен.

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

Anomaly detection

Резкий рост unique fingerprints — abuse-кампания:

SELECT
    DATE_TRUNC('hour', created_at)::TIMESTAMP AS hour,
    COUNT(DISTINCT device_fingerprint) AS unique_devices,
    COUNT(*) AS sessions,
    COUNT(*)::NUMERIC / NULLIF(COUNT(DISTINCT device_fingerprint), 0) AS sessions_per_device
FROM session_events
WHERE created_at >= CURRENT_DATE - INTERVAL '2 days'
GROUP BY DATE_TRUNC('hour', created_at)
ORDER BY hour;

Внезапный спайк unique devices — bot armies.

Частые ошибки

Ошибка 1. Fingerprint = stable forever. Browser updates меняют отпечаток. 30-90 дней стабильности — реалистично.

Ошибка 2. Игнорировать noise factors. Screen 1920x1080 + Chrome + UTC — миллионы юзеров. Без canvas/WebGL — fingerprint не уникален.

Ошибка 3. Использовать только server-side data. IP меняется. JS-side fingerprinting обязателен для устойчивости.

Ошибка 4. Privacy compliance. GDPR / CCPA требуют consent для fingerprinting. Юр-проверка.

Ошибка 5. Blocking чисто по fingerprint. Family на одной семейной машине — 3-5 разных «accounts» на 1 fingerprint. Не блокируйте автоматом.

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

FAQ

Какие поля минимум?

user_agent + screen + timezone — базовый. Canvas + audio — для уникальности.

Достаточно ли MD5?

Для матчинга — да. Для security — нет, SHA256.

Privacy concerns?

С 2026 года GDPR/CCPA требуют explicit consent на fingerprinting.

Cross-device matching?

Через login (email/phone). Fingerprint только device-level.

FingerprintJS — стоит?

Готовое решение от 30k подписки. Custom — дешевле, менее accurate.