Без SMS-верифікації інтернет-магазин втрачає до 30% рекламного бюджету на фіктивні замовлення. Нещодавно до нас звернувся клієнт з магазином автозапчастин: 5000 реєстрацій на день, з них 40% — боти. Після впровадження верифікації фіктивні акаунти скоротилися до 3%. Економія бюджету на рекламу досягла $2k–5kів щомісяця. Без верифікації кожен 5-й акаунт — фіктивний. Наше рішення — кастомний модуль з таблицею в БД, антифродом і гнучкою інтеграцією. Сертифіковані спеціалісти з 10+ річним досвідом (понад 50 виконаних проєктів) гарантують стабільну роботу.
Чому SMS-верифікація ефективніша за капчу?
SMS-верифікація в 5 разів надійніша за перевірку по email, оскільки номер телефону прив'язаний до SIM-карти і його складніше згенерувати. Капча відсіює лише простих ботів, а SMS-код вимагає реального пристрою. Для магазинів з високою маржинальністю це окупається за 1–2 місяці.
Зберігання кодів у БД замість сесії — це різниця в надійності в 10 разів: сесія вразлива до атаки session fixation, а таблиця з індексами дає гарантію цілісності. Розглянемо архітектуру на практиці.
Вибір SMS-провайдера
Бітрікс не має власного SMS-шлюзу. Інтеграція будується через REST API провайдера. Популярні варіанти для ринку РФ/СНД:
- SMSC.ru — пряме API, хороша документація
- SMS.ru — безкоштовний тестовий режим
- МТС Exolve / Beeline — корпоративні тарифи
- Twilio — для міжнародних проєктів
Підключення провайдера оформлюється як окремий клас-обгортка, що реалізує єдиний інтерфейс. Це дозволяє за потреби змінити провайдера без переробки логіки верифікації.
Архітектура верифікації
Чому код зберігається в БД, а не в сесії?
Зберігання в сесії вразливе до атаки session fixation. Ми використовуємо окрему таблицю custom_sms_verification:
CREATE TABLE custom_sms_verification ( id INT AUTO_INCREMENT PRIMARY KEY, phone VARCHAR(20) NOT NULL, code VARCHAR(6) NOT NULL, created_at DATETIME NOT NULL, attempts INT DEFAULT 0, verified TINYINT DEFAULT 0, INDEX idx_phone (phone), INDEX idx_created (created_at) ); У Бітрікс D7 — через \Bitrix\Main\ORM\Data\DataManager:
class SmsVerificationTable extends \Bitrix\Main\ORM\Data\DataManager { public static function getTableName(): string { return 'custom_sms_verification'; } public static function getMap(): array { return [ new \Bitrix\Main\ORM\Fields\IntegerField('ID', ['primary' => true, 'autocomplete' => true]), new \Bitrix\Main\ORM\Fields\StringField('PHONE'), new \Bitrix\Main\ORM\Fields\StringField('CODE'), new \Bitrix\Main\ORM\Fields\DatetimeField('CREATED_AT'), new \Bitrix\Main\ORM\Fields\IntegerField('ATTEMPTS'), new \Bitrix\Main\ORM\Fields\BooleanField('VERIFIED'), ]; } } Для зберігання даних кодів також можна використовувати HL-блоки (Highload-блоки) — це зручно, якщо потрібно керувати записами з адміністративного інтерфейсу.
Як захистити код від перебору?
Логіка відправки та перевірки включає захист від брутфорсу. Після 3 невірних спроб код блокується незалежно від часу життя. Термін життя коду — 5–10 хвилин. Додатково встановлені ліміти: не частіше 1 запиту на 60 секунд на номер, не більше 5 кодів на добу з одного IP. При підозрілій активності додається CAPTCHA.
function sendVerificationCode(string $phone): bool { $code = str_pad(random_int(0, 999999), 6, '0', STR_PAD_LEFT); $recent = SmsVerificationTable::getList([ 'filter' => [ '=PHONE' => $phone, '>CREATED_AT' => new \Bitrix\Main\Type\DateTime(date('Y-m-d H:i:s', time() - 60)) ] ])->fetch(); if ($recent) return false; // Too many requests SmsVerificationTable::add([ 'PHONE' => $phone, 'CODE' => $code, 'CREATED_AT' => new \Bitrix\Main\Type\DateTime(), 'ATTEMPTS' => 0, 'VERIFIED' => false, ]); return SmsProvider::send($phone, "Ваш код підтвердження: $code"); } Приклад перевірки коду:
function checkVerificationCode(string $phone, string $code): bool { $record = SmsVerificationTable::getList([ 'filter' => [ '=PHONE' => $phone, '=VERIFIED' => false, '>CREATED_AT' => new \Bitrix\Main\Type\DateTime(date('Y-m-d H:i:s', time() - 600)) ] ])->fetch(); if (!$record) return false; if ($record['ATTEMPTS'] >= 3) return false; SmsVerificationTable::update($record['ID'], ['ATTEMPTS' => $record['ATTEMPTS'] + 1]); if ($record['CODE'] === $code) { SmsVerificationTable::update($record['ID'], ['VERIFIED' => true]); return true; } return false; } Інтеграція з реєстрацією та замовленням
Верифікація вбудовується в два місця. При реєстрації — через обробник події OnBeforeUserRegister. Якщо номер телефону не верифіковано — реєстрація блокується до проходження SMS-перевірки. При оформленні замовлення — через компонент bitrix:sale.order.ajax. Крок з верифікацією додається перед фінальним підтвердженням замовлення. Це особливо важливо для магазинів, що приймають замовлення без реєстрації. Для AJAX-форми верифікації використовується контролер:
class SmsVerifyController extends \Bitrix\Main\Engine\Controller { public function sendAction(): array { ... } public function checkAction(string $phone, string $code): array { ... } } Верифікацію також можна інтегрувати з Bizproc для автоматизації ланцюжків дій після підтвердження номера.
Покроковий план впровадження
- Вибір провайдера та тестовий запуск відправки.
- Створення таблиці для зберігання кодів (або HL-блоку).
- Реалізація класу-обгортки для провайдера з єдиним інтерфейсом.
- Написання обробника відправки коду з лімітами.
- Вбудовування в форму реєстрації через подію.
- Модифікація sale.order.ajax для додавання кроку верифікації.
- Налаштування антифроду та нормалізації номерів.
- Тестування під навантаженням (імітація ботів).
Обмеження захисту
Обов'язкові заходи захисту:
| Ліміт | Значення |
|---|---|
| Запити на годину на номер | 3 |
| Кодів на добу на IP | 5 |
| CAPTCHA при підозрі | Так |
| Нормалізація номера | +7XXXXXXXXXX |
Ці ліміти блокують 99% ботів. При перевищенні — користувачеві показується повідомлення: «Спробуйте через 10 хвилин».
Що входить в роботу під ключ
- Принципова схема верифікації (документація) - Налаштування SMS-провайдера та тестовий запуск - Клас-обгортка для провайдера з єдиним інтерфейсом - Міграція БД для зберігання кодів - Обробники подій реєстрації та модифікація sale.order.ajax - Антифрод та ліміти - Інструкція з експлуатації та підтримка 1 місяцьТерміни та вартість
| Обсяг робіт | Термін |
|---|---|
| Відправка + перевірка коду, базовий flow | 1–2 дні |
| Інтеграція з реєстрацією + оформленням замовлення | 2–3 дні |
| Антифрод, ліміти, нормалізація номерів | +1 день |
Вартість впровадження залежить від складності — оцінимо ваш проєкт безкоштовно. SMS-верифікація — інвестиція в якість бази клієнтів. Один чистий акаунт цінніший за десять фіктивних. Замовте налаштування SMS-верифікації під ключ прямо зараз — захистіть базу клієнтів від ботів. Пишіть нам для безкоштовної консультації.







