← Главная

DS-798 — Антифрод для триала

Финальный отчёт тестирования | 10 аккаунтов, 20 проверок | PgWeb через Teleport

JiraDS-798
Backendapi-2020.review.chatplace.io
Дата26 марта 2026
AssigneeМарат Комаров
MR!2020
БДPgWeb через Teleport
13
PASS
1
BUG (Critical)
3
WARNING
10
Аккаунтов

🐛 BUG #1 (Critical): Prodamus — антифрод не блокирует повторную карту

Воспроизведено дважды:

1️⃣ Карта Visa 4242: 798@ (триал) → 798d@ (повторный триал). card_hash одинаковый: f24240e80b...

2️⃣ Карта МИР 2200 0000 0000 0004: 798i@ (триал) → 798j@ (повторный триал). card_hash одинаковый: 4c5c22a996b...

Ожидание: Триал заблокирован (type=4, CARD_ALREADY_USED)

Факт: Триал активирован! type=1, trial_ends_at заполнен. card_hash идентичен, но антифрод не проверяет дубли для Prodamus.

Примечание: Для Stripe блокировка работает корректно (798c → type=4). Баг специфичен для Prodamus и воспроизводится для любых типов карт (Visa, МИР).

🐛 BUG #2 (Medium): Фронтенд показывает успех при заблокированном триале

Шаги: Любой заблокированный триал (798c или 798f) → фронт показывает /payment/success/ с "You've activated the Pro plan" ✅

Ожидание: Сообщение об ошибке — триал заблокирован

Факт: Страница успеха. Пользователь думает что триал активирован. В БД: trial_ends_at=NULL, type=4.

Воспроизведено на: 798c@mail.com (блок по карте Stripe), 798f@mail.com (блок по боту)

⚠️ Наблюдение 1: user_fingerprint всегда NULL. Таблица user_fingerprints пуста для всех 8 аккаунтов. Поле card_fingerprints.user_fingerprint = NULL у всех. Device fingerprint не записывается ни для Stripe, ни для Prodamus. Проверки по комбинации карта+устройство (шаги 5-6 Марата) невозможны.
⚠️ Наблюдение 2: hasFingerprint API = false для всех. GET /user → hasFingerprint: false даже для юзеров с активным триалом. По плану Марата (шаг 8) ожидается true.
⚠️ Наблюдение 3: Кросс-провайдерный обход. Карта 4242 даёт разные card_hash у Stripe (0trqiz6XoXzeotX8) и Prodamus (f24240e80b...). Юзер может обойти антифрод, сменив валюту (RUB→USD или наоборот).
💳 Наблюдение 4: При блокировке триала карта авторизуется ($20 hold). В Transaction history видно списание $20 до реальной оплаты (Stripe pre-auth?). Нужно проверить: списываются ли деньги реально или это только hold, который потом отменяется.

Все тестовые аккаунты (8)

EmailВалютаProvidercard_hashSL typetrial_ends_atБотРезультат
798@RUBprodamusf24240e...12026-04-028630860407✅ Триал
798b@USDstripe0trqiz6...12026-04-02✅ Триал
798c@USD4→5NULL🛡️ Блок (карта Stripe) → Paid $432
798d@RUBprodamusf24240e...12026-04-02🐛 BUG (Prodamus не блокирует)
798e@USDstripe6AK7yoq...12026-04-02transferred✅ Триал (новая карта)
798f@USD4→5NULLот 798@🛡️ Блок (бот) → Paid $192
798g@USDstripeEjhCVAO...12026-04-028439834486✅ Триал (чистый бот)
798h@USDstripe5NULLPremium paid (TC-2.1 env)
798i@RUBprodamus4c5c22a...12026-04-02✅ Триал (МИР *0004)
798j@RUBprodamus4c5c22a...12026-04-02🐛 BUG (МИР повтор)

Секция 1: Happy Path

4/5 PASS
ТестРезультатАккаунтДанные
TC-1.1 Триал активирован✅ PASS798@, 798b@trial_ends_at = 2026-04-02
TC-1.2 card_fingerprints✅ PASS798@, 798b@Записаны для обоих провайдеров
TC-1.3 subscription_logs type=1✅ PASS798@, 798b@type=1, payment_count=0
TC-1.4 bot_ownership_history✅ PASS798@bot 8630860407, telegram
TC-1.5 user_fingerprints⚠️ WARNINGвсеПусто. user_fingerprint=NULL

Секция 2: No False Positives

SKIPPED
ТестРезультатПричина
TC-2.1 Premium→Pro downgrade⏭️ SKIPPEDНевозможно перейти с Premium на Pro на review-ветке (UI отключён)

Секция 3: Блокировка по боту

4/4 PASS
ТестРезультатАккаунтДанные
TC-3.1 Перенос бота → блок✅ PASS798f@type=4, trial_ends_at=NULL. Бот ранее у 798@ (триал)
TC-3.2 bot_ownership_history✅ PASSЛогирует все переносы: 798@ → 798e@ → 798f@
TC-3.3 Чистый бот → триал✅ PASS798g@Новый бот 8439834486, type=1, триал активирован
TC-3.4 Блок → полная оплата✅ PASS798f@Pro $192/year оплачен после блокировки по боту

Цепочка переноса: 798@ (owner 1, триал) → 798e@ (owner 2, триал с другой картой) → 798f@ (owner 3, заблокирован)

Секция 4: Блокировка по карте

4/6 (1 BUG × 2 карты)
ТестРезультатАккаунтДанные
TC-4.1 Stripe: та же карта → блок✅ PASS798c@type=4. Карта 4242 (Stripe hash 0trqiz6...)
TC-4.1b Prodamus Visa 4242: та же карта → блок🐛 FAIL798d@type=1! Пропустил. Тот же hash f24240e...
TC-4.1c Prodamus МИР: первый триал✅ PASS798i@type=1. МИР *0004, hash 4c5c22a...
TC-4.1d Prodamus МИР: повтор → блок🐛 FAIL798j@type=1! Пропустил. Тот же hash 4c5c22a... Антифрод не работает для Prodamus
TC-4.3 Другая карта → разрешён✅ PASS798e@Mastercard 5555...4444, hash 6AK7yoq...
TC-4.4 Полная оплата заблок. картой✅ PASS798c@, 798f@798c@ Pro $432/year, 798f@ Pro $192/year — оплата прошла

Секция 5: CloudPayments/Prodamus карта+устройство

BLOCKED

Тестирование невозможно: user_fingerprint = NULL для всех аккаунтов. Проверка по комбинации карта+устройство не может работать без device fingerprint.

Секция 6: Юзер без ботов

2/2 PASS
ТестРезультатАккаунтДанные
TC-6.1 Без ботов → триал разрешён✅ PASS798e@Триал активирован без бота
TC-6.2 bot_ownership пуст✅ PASS798e@bot_ownership_history пуст для этого юзера

Секция 7: API hasFingerprint

1 PASS / 1 WARNING
ТестРезультатАккаунтДанные
TC-7.1 hasFingerprint = false (новый)✅ PASS798e@false — ожидаемо для нового юзера
TC-7.2 hasFingerprint после триала⚠️ WARNING798b@false — ожидалось true (шаг 8 Марата)

Секция 8: Граничные случаи

COVERED / SKIPPED
ТестРезультатДанные
TC-8.1 Биллинг после блокировки✅ COVERED798c@ — показывает биллинг без опции триала после блока
TC-8.2 2-bot setup⏭️ SKIPPEDТребуется сложная настройка с 2 ботами
TC-8.3 Сообщение об ошибке при блоке🐛 BUG #2Нет сообщения об ошибке — показывается страница успеха

Схема БД (api-2020.review)

ТаблицаПоляПримечание
card_fingerprintsid, user_id, provider, card_hash, user_fingerprint, created_atuser_fingerprint всегда NULL
bot_ownership_historyid, bot_identifier, platform_label, owner_id, created_atКорректно логирует переносы
user_fingerprintsid, user_id, fingerprint, created_atПустая
subscription_logsid, user_id, type, payment_count, created_attype: 1=триал, 4=блок антифрода, 5=оплата
users.trial_ends_atNULL = нет/заблокирован

subscriptions и company_user отсутствуют на этой ветке.