Без SMS-верификации интернет-магазин теряет до 30% рекламного бюджета на фиктивные заказы. Недавно к нам обратился клиент с магазином автозапчастей: 5000 регистраций в день, из них 40% — боты. После внедрения верификации фиктивные аккаунты сократились до 3%. Экономия бюджета на рекламу достигла 200 000–500 000 рублей ежемесячно. Без верификации каждый 5-й аккаунт — фиктивный. Наше решение — кастомный модуль с таблицей в БД, антифродом и гибкой интеграцией. Сертифицированные специалисты с 10-летним опытом разработки на Битрикс гарантируют стабильную работу.
Почему 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;
}
Как интегрировать SMS-верификацию с регистрацией и заказом?
Верификация встраивается в два места. При регистрации — через обработчик события 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 для автоматизации цепочек действий после подтверждения номера.
Как внедрить SMS-верификацию: пошаговый план
- Выбор провайдера и тестовый запуск отправки.
- Создание таблицы для хранения кодов (или HL-блока).
- Реализация класса-обёртки для провайдера с единым интерфейсом.
- Написание обработчика отправки кода с лимитами.
- Встраивание в форму регистрации через событие.
- Модификация sale.order.ajax для добавления шага верификации.
- Настройка антифрода и нормализации номеров.
- Тестирование под нагрузкой (имитация ботов).
Какие ограничения нужно установить?
Обязательные меры защиты:
| Лимит | Значение |
|---|---|
| Запросы в час на номер | 3 |
| Кодов в сутки на IP | 5 |
| CAPTCHA при подозрении | Да |
| Нормализация номера | +7XXXXXXXXXX |
Эти лимиты блокируют 99% ботов. При превышении — пользователю показывается сообщение: «Попробуйте через 10 минут».
Что входит в работу
- Принципиальная схема верификации (документация)
- Настройка SMS-провайдера и тестовый запуск
- Класс-обёртка для провайдера с единым интерфейсом
- Миграция БД для хранения кодов
- Обработчики событий регистрации и модификация sale.order.ajax
- Антифрод и лимиты
- Инструкция по эксплуатации и поддержка 1 месяц
Сроки выполнения
| Объём работ | Срок |
|---|---|
| Отправка + проверка кода, базовый flow | 1–2 дня |
| Интеграция с регистрацией + оформлением заказа | 2–3 дня |
| Антифрод, лимиты, нормализация номеров | +1 день |
Стоимость внедрения зависит от сложности и рассчитывается индивидуально после аудита вашего проекта. SMS-верификация — инвестиция в качество базы клиентов. Один чистый аккаунт ценнее десяти фиктивных. Закажите настройку SMS-верификации прямо сейчас — защитите базу клиентов от ботов. Свяжитесь с нами для бесплатной консультации.







