Захистіть OTP від ботів, перебору та зливу коштів
Повний довідник щодо поведінкових лімітів, проксі, підмереж, чорних списків, карантину, бюджетів SMS/Viber і дзвінків.
Починайте з профілю, а не з випадкових чисел
Кожне числове поле має окрему семантику: нуль може вимикати перевірку, означати відсутність вікна або забороняти дію. Перед зміною звіртеся з таблицями нижче.
Надто жорсткі ліміти блокуватимуть реальних клієнтів. Надто м’які — дозволять ботам спалювати баланс провайдера.
Усі поля, варіанти та перевірки
Нижче наведено повний профільний розділ офіційної інструкції модуля, без скорочень і маркетингового переказу.
15. OTP - безпека
Безпека OTP потрібна, щоб клієнт або бот не міг безкінечно просити коди і витрачати баланс магазину.
Не вимикайте всі ліміти. Без них OTP може стати дорогою діркою в бюджеті.
Як читати числові поля безпеки
У багатьох лімітах значення 0 означає “вимкнути саме цей ліміт”. Це не завжди добре. Якщо поставити 0 усюди, модуль перестане стримувати спам, і провайдер буде списувати гроші за кожен зайвий код, SMS або дзвінок.
Одиниці часу вказані біля поля:
| Позначення | Що означає |
|---|---|
сек. | Секунди. |
хв. | Хвилини. |
год. | Години. |
дн. | Дні. |
Ставте ліміти м'яко на старті, потім посилюйте за результатами моніторингу. Найгірший варіант у безпеці - одразу заблокувати нормальних клієнтів і не зрозуміти чому.
Швидка схема телефону
| Поле | Що означає | Що робити |
|---|---|---|
Швидкий пошук телефонів | Технічна перевірка, чи готові індекси для пошуку номерів. | Якщо показує, що все готово - нічого не робіть. Якщо є помилка - відкрийте модуль після оновлення або зверніться до розробника. |
Поведінковий захист
Цей блок дивиться не тільки на номер, а й на поведінку браузера і сесії.
Поведінковий захист потрібен проти ситуації, коли з одного браузера або однієї сесії пробують багато різних номерів. Нормальний клієнт може помилитись у номері один-два рази. Бот або зловмисник перебирає номери серіями. Саме цю різницю і ловить блок.
| Поле | Що блокує | Як налаштовувати |
|---|---|---|
Адаптивний захист джерела | Серійні OTP-запити на різні номери. | Увімкніть для реального магазину. |
Мінімальний вік форми | Занадто швидку відправку форми після відкриття. | Захищає від ботів. Залиште стандартне. |
Строк життя форми захисту | Старі або повторно використані форми. | Залиште стандартне значення. |
Пауза на зміну номера | Швидку зміну телефонів з одного браузера. | Корисно проти перебору номерів. |
Вікно аналізу ризику | За який час рахувати підозрілу активність. | Чим більше вікно, тим довше пам'ятається активність. |
Ліміт різних номерів по браузеру | Багато різних номерів з одного браузера. | Не ставте занадто низько, щоб не блокувати нормальні виправлення. |
Ліміт різних номерів по сесії | Багато різних номерів в одній сесії. | Корисно для оформлення замовлення. |
Запас на виправлення номера | Дає клієнту виправити помилку в номері. | Залиште невеликий запас. |
Поріг схожості номера | Визначає, чи зміна номера схожа на виправлення помилки. | Залиште стандартне, якщо не впевнені. |
Пам'ять довіри до браузера | Запам'ятовує браузер, який уже успішно проходив OTP. | Допомагає постійним клієнтам. |
Бонус довіреного браузера | М'якші ліміти для довіреного браузера. | Корисно для лояльних клієнтів. |
Пауза журналу атак | Не засмічує журнал однаковими подіями. | Залиште стандартне. |
Ізоляція браузера | Тимчасово обмежує підозрілий браузер. | Увімкніть при атаках або активному OTP. |
Ізоляція сесії | Тимчасово обмежує підозрілу сесію. | Увімкніть при активному OTP. |
Як налаштовувати безпечніше:
- не ставте
Ліміт різних номерів по браузерув1, бо клієнт може виправити телефон; - залиште
Запас на виправлення номера, щоб люди могли виправляти помилки; - не робіть
Ізоляція браузерана багато годин на старті; - якщо бачите реальну атаку в моніторингу, тоді посилюйте ліміти поступово.
IP, проксі та підмережі
Цей блок потрібен, щоб бот не обходив IP-ліміти підробленими заголовками X-Forwarded-For. Модуль довіряє переспрямованій IP-адресі тільки тоді, коли запит реально прийшов від Cloudflare або від проксі з діапазону CIDR, який ви явно вказали.
| Поле | Що робить | Рекомендація |
|---|---|---|
Довіряти Cloudflare | Дозволяє брати IP і країну із заголовків Cloudflare, тільки якщо REMOTE_ADDR належить діапазону Cloudflare CIDR. | Увімкніть тільки якщо магазин справді працює через Cloudflare. |
Довірені proxy CIDR | Список мереж ваших зворотних проксі, яким можна довіряти заголовки X-Forwarded-For або X-Real-IP. | Заповнюйте тільки реальні CIDR вашого проксі або балансувальника навантаження. Не додавайте 0.0.0.0/0. |
Номерів з підмережі | Скільки різних телефонів може отримати OTP з однієї IP-підмережі за вікно. | Корисно проти пулів проксі. 0 вимикає тільки ліміт підмережі. |
Вікно підмережі | За скільки годин рахувати різні телефони з підмережі. | Почніть з 1 години і коригуйте за реальним трафіком. |
У журналі безпеки для таких рішень зберігаються службові поля resolved_ip, raw_remote_addr, ip_subnet, proxy_trusted, source_hash, risk_score і risk_level. Вони дають змогу зрозуміти, чи використано реальну IP-адресу, чи підроблений заголовок.
Захист бюджету SMS/Viber
Цей блок ставить фінальну межу для платних SMS/Viber-спроб усього магазину. Він потрібен проти ситуації, коли зловмисник змінює телефон, браузер, сесію або відкриває інкогніто і намагається змусити магазин платити за нові відправки.
| Поле | Що робить | Рекомендація |
|---|---|---|
Глобальний за 24 год. | Загальна межа платних SMS/Viber-спроб за останні 24 години. | Установіть реальну денну межу. 0 вимикає тільки глобальний ліміт і OTP-резерв, але не вимикає окремі ліміти типів надсилання. |
OTP-резерв | Частина глобального ліміту, яку надсилання не-OTP не можуть витратити. | Залишайте резерв, достатній для нормального підтвердження номерів. Працює тільки якщо глобальний ліміт увімкнено. |
OTP / Замовлення / Відкладені / Адмін / Ручні / Масові / Інші | Окремі добові ліміти для різних типів надсилання. | Не давайте масовим або відкладеним надсиланням витратити бюджет OTP. 0 вимикає тільки конкретний ліміт типу надсилання. |
Недовірені OTP за 24 год. | Окрема межа для OTP із нових або недовірених джерел браузера чи сесії. | Це перший запобіжник проти витрати бюджету саме на підтвердження номерів. |
Резерв для довірених OTP | Частина глобального ліміту, яку недовірені OTP не можуть витратити. | Залишає запас для редагування облікового запису авторизованим клієнтом або для браузера чи сесії, з яких уже успішно підтверджували номер. |
Viber cascade units | Скільки бюджетних одиниць списувати за Viber із резервним SMS або каскадним надсиланням. | За замовчуванням 2, бо одна спроба може коштувати як Viber + SMS. |
Warning / Tighten / Lockdown, % | Пороги аварійного режиму від використання загального бюджету. | 70/85/95 — нормальний початок: попередження, посилення захисту та блокування недовірених платних OTP. |
Стартові значення після першого збереження: глобальний ліміт — 1000, OTP-резерв — 100, OTP — 300, замовлення — 300, відкладені — 200, адміністративні — 100, ручні — 100, масові — 100, інші — 100, недовірені OTP — 200, резерв для довірених OTP — 50, Viber cascade units — 2, пороги аварійного режиму — 70/85/95.
Антизливний профіль для магазину з українською аудиторією і активним OTP:
| Поле | Значення |
|---|---|
Глобальний за 24 год. | 300 |
OTP-резерв | 100 |
OTP за 24 год. | 160 |
Недовірені OTP за 24 год. | 60 |
Резерв для довірених OTP | 50 |
Замовлення за 24 год. | 80 |
Відкладені за 24 год. | 40 |
Адмін за 24 год. | 30 |
Ручні за 24 год. | 20 |
Масові за 24 год. | 10 |
Інші за 24 год. | 20 |
Viber cascade units | 2 |
Warning / Tighten / Lockdown, % | 60 / 75 / 90 |
Цей профіль рано попереджає адміністратора, швидко обмежує недовірені OTP і залишає резерв для довірених підтверджень. Якщо магазин має більше реальних OTP на добу, збільшуйте Глобальний, OTP і Недовірені OTP пропорційно, але не вимикайте ліміти типів надсилання значенням 0.
Важливо: 0 не є універсальним значенням «вимкнути все». Якщо поставити 0 у Глобальний за 24 год., модуль не застосовує глобальну межу й OTP-резерв, але ліміти типів надсилання OTP, Масові, Ручні, Відкладені та інші продовжують працювати. Якщо поставити 0 в окремому типі надсилання, вимикається тільки його ліміт.
Що рахується:
- рахуються тільки платні спроби
SMS,Viberі провайдерського каскадуViber+SMS/cascade; - Telegram і дзвінки не входять у цей бюджет;
- якщо шлюз не повідомляє, чи каскадна спроба Viber реально перейшла на SMS, модуль обережно рахує її як платну Viber/SMS-спробу;
- ручні, масові, OTP, відкладені, замовлення і службові відправки мають окремі ліміти типів надсилання.
Технічно бюджет рахується не за вкладкою Звіт, а за таблицею журналу sap_sms_budget_usage. Перед запитом до шлюзу створюється запис reserved (зарезервовано), після фактичної спроби він стає charged (списано), а якщо надсилання зупинилося локально до звернення до провайдера — released (звільнено). У рухомий 24-годинний бюджет входять тільки charged і ще не протерміновані reserved.
Коли ліміт вичерпано, модуль блокує платну SMS/Viber-відправку до запиту в провайдера. Клієнт у OTP бачить повідомлення: Надсилання коду тимчасово обмежено. Будь ласка, спробуйте пізніше. В адмінці ручна або масова відправка покаже помилку про вичерпаний SMS/Viber-бюджет.
Довірені OTP — це не просто номери, що існують у таблиці customer. Довіреним вважається редагування облікового запису авторизованим клієнтом або номер, який уже успішно підтверджували з цього браузера чи сесії в межах довіреного вікна. Запит із нового браузера, нової сесії, підозрілого проксі або серії різних номерів вважається недовіреним і при підвищеному ризику першим втрачає платне резервне надсилання через SMS/Viber.
Аварійний режим працює від використання загального бюджету:
Warning- Telegram-попередження адміну;Посилення— недовірені OTP з рівнем ризику «середній або вищий» блокуються для платних SMS/Viber;Повне блокування— недовірені платні OTP блокуються повністю, а довірені OTP можуть пройти тільки якщо жорсткі загальна й OTP-межа це дозволяють.
OTP-резерв захищає нормального клієнта тільки від того, що надсилання не-OTP витратять загальний бюджет. Якщо OTP-атака пройде крізь поведінкові ліміти через багато IP-адрес, браузерів, сесій і реальних номерів, вона може вичерпати окремий ліміт OTP або весь глобальний ліміт. Тоді автоматичне SMS/Viber-підтвердження номера зупиниться до звільнення 24-годинного вікна або зміни ліміту адміністратором. Практичний запасний шлях — Telegram чи дзвінок, якщо вони підключені, або ручна перевірка менеджером для конкретного клієнта.
Якщо ввімкнені Telegram-сповіщення адміністратору, модуль надішле критичне повідомлення про вичерпання SMS/Viber-бюджету із зазначенням типу надсилання, каналу, типу ліміту, використаного обсягу й межі, джерела, контексту та рівня ризику. Це повідомлення надсилається через Telegram без резервного SMS, щоб саме попередження не витрачало бюджет.
Захист бюджету дзвінків
Цей блок важливий, якщо ви використовуєте авторизацію дзвінком.
Дзвінки можуть коштувати грошей так само, як SMS, а іноді й дорожче. Тому для дзвінків є окремий бюджетний захист. Він працює незалежно від звичайних OTP-лімітів.
| Поле | Що робить | Рекомендація |
|---|---|---|
Захист бюджету дзвінків | Вмикає окремі ліміти для платних дзвінків. | Увімкніть, якщо дзвінки активні. |
Дзвінків з IP | Ліміт стартів дзвінка з однієї IP. | Захищає від масового запуску дзвінків. |
Вікно IP | За який час рахувати дзвінки з IP. | Ставте розумне вікно, наприклад кілька годин. |
Дзвінків на номер за 24 год. | Ліміт дзвінків на один номер. | Захищає від повторних дзвінків на той самий телефон. |
Дзвінків з браузера на номер | Ліміт для пари браузер/номер. | Захищає від повторних спроб з одного джерела. |
Загальний ліміт дзвінків за 24 год. | Денна межа дзвінків для всього магазину. | Обов'язково поставте, щоб не спалити бюджет. |
Якщо підтвердження дзвінком увімкнене як запасний або основний шлях, не залишайте цей захист вимкненим. Практичний початковий набір проти зайвих витрат: Дзвінків з IP — 3, Вікно IP — 1, Дзвінків на номер за 24 год. — 3, Дзвінків з браузера на номер — 4, Загальний ліміт дзвінків за 24 год. — 50. Для магазину з більшим реальним трафіком збільшуйте тільки загальний та IP-ліміт, а не вимикайте захист повністю.
Практична логіка:
Дзвінків з IPловить атаку з одного інтернет-джерела;Дзвінків на номер за 24 год.не дає багато разів дзвонити на один телефон;Дзвінків з браузера на номерне дає одному клієнту або боту крутити дзвінок на той самий номер;Загальний ліміт дзвінків за 24 год.- останній запобіжник для всього магазину.
Коли ліміт дзвінків вичерпано, клієнт бачить повідомлення: Підтвердження дзвінком тимчасово обмежено. Спробуйте пізніше. Якщо увімкнені Telegram-алерти адміну, модуль надішле критичний Telegram-алерт про вичерпання ліміту дзвінків.
Валідність запитів
| Поле | Що блокує | Рекомендація |
|---|---|---|
Ліміт invalid-запитів | Неправильні або підроблені OTP-запити. | Увімкніть. Англійська частина тут залишена, бо це точна назва поля в інтерфейсі. |
Вікно invalid-запитів | За який час рахувати некоректні запити. | Залиште стандартне значення. |
Бан за invalid-запити | Блокує IP після великої кількості підроблених запитів. | Увімкніть, але не починайте з надто довгого блокування. |
Некоректний запит — це запит, який надійшов не так, як має надходити нормальна форма сайту: без правильного методу, ознаки AJAX, токена, одноразового номера або інших службових полів.
Приклади причин некоректних запитів:
| Причина | Просте пояснення |
|---|---|
invalid_method | Запит прийшов не тим HTTP-методом. Нормальна OTP-дія має йти правильною формою. |
invalid_ajax_header | Немає AJAX-ознаки, часто це ручний або бот-запит. |
invalid_token | Не збігся службовий токен форми. |
invalid_honeypot | Заповнене приховане поле-пастка, яке нормальний клієнт не бачить. |
invalid_device | Не збігся ідентифікатор браузера. |
invalid_nonce | Одноразовий службовий номер відсутній, прострочений або вже використаний. |
Мережеві обмеження
| Поле | Що робить | Як вибрати |
|---|---|---|
Geo-IP фільтр | Перевіряє країну користувача за IP. | Увімкніть, якщо магазин працює тільки з певними країнами. |
Дозволені країни Geo-IP | Список країн, яким дозволено OTP за IP. | Для України ua, для кількох країн ua,pl. |
Обмежити OTP по IP | Обмежує багато різних номерів з однієї IP. | Увімкніть для захисту від перебору. |
Ліміт різних номерів з IP | Скільки номерів можна пробувати з однієї IP. | Не ставте занадто низько через мобільні мережі та офіси. |
Вікно IP-ліміту | За який час рахувати номери з IP. | Залиште стандартне або поставте 1-2 години. |
Тривалість бану IP | На скільки заблокувати IP. | Почніть м'яко, посилюйте при атаках. |
Прогресивні IP-бани | Кожне повторне порушення дає довший бан. | Увімкніть при реальних атаках. |
Пам'ять страйків для IP-банів | Скільки днів пам'ятати попередні бани. | Чим більше, тим суворіше. |
Перший IP-бан | Тривалість першого бану. | Невелика тривалість. |
Другий IP-бан | Тривалість другого бану. | Більше за перший. |
Третій і наступні IP-бани | Тривалість повторних банів. | Найдовша тривалість. |
Ліміт на номер за 24 год | Скільки джерел можуть просити OTP на один номер за добу. | Увімкніть. |
Ліміт на номер з одного браузера / сесії | Скільки кодів на один номер може просити те саме джерело. | Увімкніть. |
Білий список IP | IP-адреси, які не блокуються і не проходять фільтр Geo-IP. | Додавайте тільки свої довірені IP-адреси. |
Чорний список телефонів | Телефони, яким OTP не надсилається. | Додайте номери, які використовують для атак або тестового сміття. |
Важлива різниця:
| Налаштування | Що перевіряє |
|---|---|
Обмежити відправку SMS за кодом країни в загальних налаштуваннях | Країну самого телефонного номера. |
Geo-IP фільтр у безпеці | Країну відвідувача за IP. |
Це різні речі. Клієнт може мати український номер, але зайти з польської IP. Або навпаки. Не змішуйте ці два фільтри, бо можна випадково заблокувати нормальних покупців.
Жорсткий антизливний профіль для OTP:
| Поле | Значення |
|---|---|
Ліміт invalid-запитів | 5 |
Вікно invalid-запитів | 5 хвилин |
Бан за invalid-запити | 24 години |
Geo-IP фільтр | Вкл, якщо магазин працює тільки з країнами зі списку |
Дозволені країни Geo-IP | ua для українського магазину |
Ліміт різних номерів з IP | 6 за 1 годину |
Номерів з підмережі | 12 за 1 годину |
Ліміт на номер за 24 год | 3 |
Ліміт на номер з одного браузера / сесії | 5 |
Пауза на зміну номера | 60 секунд |
Ліміт різних номерів по браузеру | 3 |
Ліміт різних номерів по сесії | 3 |
Запас на виправлення номера | 3 |
Бонус довіреного браузера | 1 |
Ізоляція браузера | 1440 хвилин |
Ізоляція сесії | 240 хвилин |
Прогресивні IP-бани | Вкл, 1 / 24 / 168 годин |
Довіряти Cloudflare вмикайте тільки якщо магазин реально працює через Cloudflare. Довірені proxy CIDR заповнюйте тільки реальними CIDR вашого зворотного проксі. Не додавайте чужі мережі, приватні діапазони «про всяк випадок» або 0.0.0.0/0, бо тоді захист від підроблених заголовків перетвориться на декорацію.
Рекомендований старт
Для першого запуску:
- увімкніть повторні OTP-ліміти;
- увімкніть ліміт неправильних кодів;
- увімкніть адаптивний захист джерела;
- увімкніть ліміт по IP;
- установіть глобальний ліміт бюджету SMS/Viber, OTP-резерв, межі для недовірених і довірених OTP,
Viber cascade unitsта ліміти типів надсилання; - якщо використовуєте дзвінки, увімкніть захист бюджету дзвінків;
- увімкніть Telegram-сповіщення
Ліміт бюджету SMS/Viber, щоб адміністратор отримував повідомлення при досягненні жорсткої межі, вичерпанні OTP-резерву, аварійному посиленні чи повному блокуванні або помилці захисту бюджету; - не ставте надто жорсткі бани в перший день;
- перевіряйте моніторинг після запуску.
Якщо нормальні клієнти почали скаржитися, що не можуть отримати OTP, не вимикайте весь захист одразу. Спочатку подивіться OTP -> Моніторинг, хто і чому був заблокований.
Готові профілі безпеки
| Ситуація | Що робити |
|---|---|
| Перший запуск OTP | Увімкнути базові ліміти повторних запитів, неправильних кодів, адаптивний захист і IP-ліміт. Бани залишити помірними. |
| Багато бот-запитів на різні номери | Зменшити ліміт різних номерів по браузеру, сесії та IP. Увімкнути прогресивні IP-бани. |
| Багато неправильних кодів | Зменшити кількість помилкових спроб OTP і збільшити блокування після помилки. |
| Багато SMS/Viber або підозра на зайву витрату бюджету | Установити глобальну межу, OTP-резерв, межі для недовірених і довірених OTP, Viber cascade units та ліміти типів надсилання; увімкнути Ліміт бюджету SMS/Viber у Telegram-сповіщеннях; перевірити резервне надсилання у Viber/Telegram, налаштування проксі й дивитися OTP -> Моніторинг. |
| Багато дзвінків | Увімкнути захист бюджету дзвінків і поставити денний ліміт магазину. |
| Частина клієнтів блокується помилково | Перевірити моніторинг, збільшити запас на виправлення номера, м'якше налаштувати IP-бан і ізоляцію. |