Обновление: 4.19.0
Это обновление безопасности. Рекомендуется установить его всем.
Если вы покупали модуль в Маркетплейсе — обновите его на странице модуля в Маркетплейсе.
Эта инструкция нужна только тем, у кого нет доступа к официальному обновлению и кто хочет применить исправления вручную.
Обычная работа модуля не меняется: существующие роуты, токены и настройки остаются рабочими.
Что исправлено
1. Роут provider
Нативный роут provider — добавлен запрет на вызов опасных классов и методов (чёрный список), есть режим белого списка.
2. Журнал запросов
Выборки переведены на безопасное ORM, закрыта возможность SQL-инъекции.
3. Генерация токенов
Генерация стала криптостойкой; ранее выданные токены продолжают работать.
4. Определение IP-адреса
Адрес берётся только из доверенного источника, подделать заголовком нельзя.
5. Защита от перебора
На роуты управления токеном добавлено ограничение числа неудачных попыток с одного IP — защита от подбора логина и пароля.
6. Создание пользователя
При создании пользователя через API системные поля (группы, токен, служебные атрибуты) больше нельзя задать напрямую — защита от повышения привилегий.
7. Генерация токенов в админке
Административный метод массовой генерации токенов теперь требует авторизации в админке и защищён от подделки запросов (CSRF).
8. Код поля токена
Имя поля токена из настроек теперь проверяется перед подстановкой в запросы к базе — закрыта возможность инъекции через эту настройку.
9. Прочее
Удаление пользователя, демо-контроллер и заголовки ответа получили мелкие усиления.
Установка патча
1. Загрузка патча
Скачать patch.zip2. Резервная копия
Перед установкой скопируйте папку модуля — на случай отката:
/bitrix/modules/artamonov.rest/3. Распаковка архива
Внутри архива файлы уже разложены по своим местам — начиная с папки bitrix. Распакуйте архив в корневую папку сайта и согласитесь заменить файлы.
patch.zip
└── bitrix/
└── modules/
└── artamonov.rest/
├── admin/
│ ├── ajax/security.php
│ └── pages/rest-api-security.php
├── install/version.php
└── lib/
├── controllers/native/ (example.php, provider.php, token.php, user.php)
└── foundation/ (helper.php, journal.php, request.php, requestlimittable.php, response.php, settings.php)Путь распаковки должен совпасть с уже установленным модулем — файлы просто заменятся новыми.
Ничего удалять вручную не нужно.
4. Проверка версии
Откройте Marketplace → Установленные решения и убедитесь, что указана версия 4.19.0.
Если версия обновилась — патч применён.
Подробнее об изменениях
Ниже — что именно поменялось в файлах, если хочется понять суть правок.
1. Роут provider
Перед вызовом класса и метода теперь выполняется проверка доступа.
По умолчанию работает чёрный список: он запрещает потенциально опасные операции — управление пользователями и группами, файловые операции и заливку файлов, прямые запросы к базе, внешние HTTP-запросы и т.п.
Обычные «читающие» вызовы вроде getList не затрагиваются.
Если нужно ограничить доступ жёстче, можно включить режим белого списка — разрешить только нужные классы и методы.
2. Генерация токенов
Токен больше не строится на основе md5() и предсказуемого rand() — вместо этого используется криптостойкий генератор случайных байт.
Формат токена не изменился, ранее выданные токены остаются рабочими.
// До
public function generateToken($userId = '', $userLogin = '')
{
$token = md5($userId . '-' . $userLogin . '=' . date('Y-m-dH:i:s') . $this->generateUniqueCode());
$token = str_split($token, 8);
$token = implode('-', $token);
return $token;
}
// После
public function generateToken($userId = '', $userLogin = '')
{
$token = bin2hex(random_bytes(16));
$token = str_split($token, 8);
$token = implode('-', $token);
return $token;
}Аналогично уникальные коды теперь берутся из random_int() вместо rand():
// До
$code .= $characters[rand(0, $charactersLength - 1)];
// После
$code .= $characters[random_int(0, $charactersLength - 1)];3. Определение IP-адреса
IP-адрес клиента теперь берётся только из REMOTE_ADDR.
Раньше учитывались заголовки, которые клиент может подставить сам, — это позволяло подменить IP в логах и обойти ограничение частоты запросов.
// До
public function ip()
{
if ($this->ip === null) {
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$this->ip = $_SERVER['HTTP_CLIENT_IP'];
} else {if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$this->ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$this->ip = $_SERVER['REMOTE_ADDR'];
}}
}
return $this->ip;
}
// После
public function ip()
{
if ($this->ip === null) {
$this->ip = $_SERVER['REMOTE_ADDR'] ?? '';
}
return $this->ip;
}4. Защита от перебора
Роуты управления токеном (создание, получение, удаление) аутентифицируют пользователя по логину и паролю.
Теперь на них действует ограничение: если с одного IP за короткий промежуток времени накапливается слишком много неудачных попыток, дальнейшие запросы временно отклоняются с ответом 429. Это защищает от подбора учётных данных.
Привязка к IP, а не к логину, выбрана специально — чтобы перебором нельзя было заблокировать чужую учётную запись.
5. Создание пользователя
При создании пользователя через API теперь нельзя напрямую задать системные поля — группы (GROUP_ID), поля токена и служебные атрибуты.
Раньше такие поля принимались наравне с обычными, что позволяло, например, создать пользователя с правами администратора. Обычные поля (логин, e-mail, пароль, имена, контакты, собственные UF_*-поля) работают как прежде.
Список системных полей можно изменить, перекрыв роут.
6. Генерация токенов в админке
В разделе «Безопасность» есть инструмент массовой генерации токенов для пользователей. Он работает через служебный AJAX-запрос.
Раньше этот запрос не проверял, кто его отправляет. Теперь он доступен только авторизованным в админке сотрудникам с правом на раздел «Безопасность» и защищён от подделки запросов (CSRF). Внешний запрос со стороны больше не может запустить генерацию токенов.
На обычную работу модуля это не влияет — генерация из интерфейса работает как прежде.
7. Код поля токена
В настройках можно задать имя пользовательского поля, в котором хранится токен. Это значение подставлялось в запросы к базе как есть.
Теперь оно проверяется: допускается только корректное имя поля (буквы, цифры, подчёркивание), иначе используется значение по умолчанию. Это исключает возможность подставить через настройку посторонний фрагмент SQL.
Эксплуатировать это мог только администратор с доступом к настройкам, поэтому риск был невысоким — но место укреплено.
8. Прочее
| Файл | Что изменилось |
|---|---|
journal.php | Выборки переписаны на ORM, значения экранируются автоматически |
user.php | ID пользователя приводится к числу перед удалением |
example.php | Демо-роут отдаёт только безопасные поля вместо всего $_SERVER |
response.php | Из заголовков ответа вырезаются переводы строки |