БАЗА ЗНАНЬ
PHP 5.6–8.3ionCube Loader 13+OpenCart / ocStore 2.3–3.x
Ліміти, мережа і бюджет

Захистіть OTP від ботів, перебору та зливу коштів

Повний довідник щодо поведінкових лімітів, проксі, підмереж, чорних списків, карантину, бюджетів SMS/Viber і дзвінків.

01

Починайте з профілю, а не з випадкових чисел

Кожне числове поле має окрему семантику: нуль може вимикати перевірку, означати відсутність вікна або забороняти дію. Перед зміною звіртеся з таблицями нижче.

УВАГА

Надто жорсткі ліміти блокуватимуть реальних клієнтів. Надто м’які — дозволять ботам спалювати баланс провайдера.

ПОВНА ІНСТРУКЦІЯ

Усі поля, варіанти та перевірки

Нижче наведено повний профільний розділ офіційної інструкції модуля, без скорочень і маркетингового переказу.

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 units2, пороги аварійного режиму — 70/85/95.

Антизливний профіль для магазину з українською аудиторією і активним OTP:

ПолеЗначення
Глобальний за 24 год.300
OTP-резерв100
OTP за 24 год.160
Недовірені OTP за 24 год.60
Резерв для довірених OTP50
Замовлення за 24 год.80
Відкладені за 24 год.40
Адмін за 24 год.30
Ручні за 24 год.20
Масові за 24 год.10
Інші за 24 год.20
Viber cascade units2
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 год.Денна межа дзвінків для всього магазину.Обов'язково поставте, щоб не спалити бюджет.

Якщо підтвердження дзвінком увімкнене як запасний або основний шлях, не залишайте цей захист вимкненим. Практичний початковий набір проти зайвих витрат: Дзвінків з IP3, Вікно IP1, Дзвінків на номер за 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 на один номер за добу.Увімкніть.
Ліміт на номер з одного браузера / сесіїСкільки кодів на один номер може просити те саме джерело.Увімкніть.
Білий список IPIP-адреси, які не блокуються і не проходять фільтр Geo-IP.Додавайте тільки свої довірені IP-адреси.
Чорний список телефонівТелефони, яким OTP не надсилається.Додайте номери, які використовують для атак або тестового сміття.

Важлива різниця:

НалаштуванняЩо перевіряє
Обмежити відправку SMS за кодом країни в загальних налаштуванняхКраїну самого телефонного номера.
Geo-IP фільтр у безпеціКраїну відвідувача за IP.

Це різні речі. Клієнт може мати український номер, але зайти з польської IP. Або навпаки. Не змішуйте ці два фільтри, бо можна випадково заблокувати нормальних покупців.

Жорсткий антизливний профіль для OTP:

ПолеЗначення
Ліміт invalid-запитів5
Вікно invalid-запитів5 хвилин
Бан за invalid-запити24 години
Geo-IP фільтрВкл, якщо магазин працює тільки з країнами зі списку
Дозволені країни Geo-IPua для українського магазину
Ліміт різних номерів з IP6 за 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-бан і ізоляцію.
Потрібна швидка перевірка?Відкрити діагностику →
ПРЯМИЙ ЗВ’ЯЗОК

Потрібна адаптація або Telegram-сервер?

Зв’язок з автором модуля щодо сумісності, встановлення, нестандартної теми, оформлення замовлення та платного підключення Telegram-сервера.