Как посчитать device fingerprinting в SQL
Содержание:
Зачем 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 нужен.
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. Не блокируйте автоматом.
Связанные темы
- Как посчитать fraud score в SQL
- Как посчитать velocity check в SQL
- Как посчитать IP velocity в SQL
- Как посчитать data uniqueness в SQL
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.