CUser::SendPassword запускает штатный сценарий
восстановления пароля: генерирует ссылку с ограниченным сроком
действия и отправляет её на почту пользователя. Разберём, как вызвать
его вручную, и какие настройки влияют на то, что получит пользователь.
Базовый вызов
<?php
$user = new CUser;
$result = $user->SendPassword([
'LOGIN' => 'ivan_petrov',
'EMAIL' => '',
]);
if ($result) {
echo 'Письмо отправлено';
} else {
echo 'Ошибка: ' . $user->LAST_ERROR;
}
Метод принимает либо логин, либо email — достаточно одного из них, система сама найдёт соответствующего пользователя. Если найдено несколько пользователей с одинаковым email, потребуется указать логин для однозначного выбора.
Что происходит при вызове
- Система находит пользователя по переданным данным.
- Генерируется временная ссылка со специальным кодом подтверждения.
- Отправляется письмо по почтовому событию восстановления пароля.
- Пользователь переходит по ссылке и задаёт новый пароль на странице подтверждения.
Сама смена пароля происходит не в момент вызова SendPassword,
а позже — когда пользователь перейдёт по ссылке и подтвердит новое
значение. До этого момента старый пароль продолжает действовать.
Нужна помощь с Битрикс?
Настройка письма
Текст письма определяется почтовым шаблоном соответствующего события — тем же механизмом, что и остальные системные уведомления. Оформление и переменные, доступные в шаблоне, настраиваются в разделе Сервисы → Почтовые события → Шаблоны, где для события восстановления пароля доступна переменная со ссылкой подтверждения.
Срок действия ссылки
Ссылка восстановления действует ограниченное время, заданное в настройках главного модуля. По истечении срока переход по ней завершится ошибкой, и пользователю потребуется запросить восстановление заново. Слишком долгий срок действия снижает безопасность — забытое в почтовом ящике письмо остаётся рабочим ключом доступа дольше необходимого.
Программный вызов из своей формы
Если восстановление пароля инициируется не штатной формой, а собственной логикой — например, из личного кабинета CRM-интеграции, — метод вызывается напрямую, а результат обрабатывается для показа пользователю понятного сообщения:
<?php
$user = new CUser;
$email = $_POST['email'] ?? '';
if (empty($email)) {
$error = 'Укажите email';
} else {
$result = $user->SendPassword(['EMAIL' => $email]);
if ($result) {
$message = 'Проверьте почту — мы отправили ссылку для восстановления';
} else {
// не раскрываем, существует ли такой email в базе
$message = 'Если такой адрес зарегистрирован, письмо уже отправлено';
}
}
Обратите внимание на формулировку сообщения при ошибке: одинаковый ответ независимо от того, найден пользователь или нет, — стандартная практика безопасности. Она не позволяет злоумышленнику перебором email-адресов выяснить, какие из них зарегистрированы на сайте.
Ограничение частоты запросов
Штатный механизм восстановления пароля стоит защитить от массовых автоматических запросов — иначе форма превращается в инструмент для рассылки спама на произвольные адреса под видом писем восстановления. Ограничение частоты обычно реализуется на уровне формы: капчей или лимитом запросов с одного IP-адреса за период времени.
Частые ошибки
- Ответ раскрывает, найден ли пользователь. Разные сообщения для «есть такой email» и «нет такого» — подсказка для перебора.
- Нет ограничения на частоту запросов. Форма восстановления используется для спам-рассылки.
- Слишком долгий срок действия ссылки. Повышает риск компрометации через старое, забытое письмо.
- Не проверяется результат вызова. Пользователь не получает обратной связи о том, отправлено письмо или нет.
Итог
CUser::SendPassword запускает штатный сценарий
восстановления: находит пользователя по логину или email, отправляет
временную ссылку и не меняет пароль до подтверждения пользователем.
При использовании в собственной форме важно не раскрывать в ответе,
найден ли указанный адрес в базе, и защитить форму от автоматических
массовых запросов.
