Документация1С-Битрикс: Модулиartamonov.restОбновления

Обновление: 4.19.0

Это обновление безопасности. Рекомендуется установить его всем.

Если вы покупали модуль в Маркетплейсе — обновите его на странице модуля в Маркетплейсе.

Эта инструкция нужна только тем, у кого нет доступа к официальному обновлению и кто хочет применить исправления вручную.

Обычная работа модуля не меняется: существующие роуты, токены и настройки остаются рабочими.

Что исправлено

1. Роут provider

Нативный роут provider — добавлен запрет на вызов опасных классов и методов (чёрный список), есть режим белого списка.

2. Журнал запросов

Выборки переведены на безопасное ORM, закрыта возможность SQL-инъекции.

3. Генерация токенов

Генерация стала криптостойкой; ранее выданные токены продолжают работать.

4. Определение IP-адреса

Адрес берётся только из доверенного источника, подделать заголовком нельзя.

5. Защита от перебора

На роуты управления токеном добавлено ограничение числа неудачных попыток с одного IP — защита от подбора логина и пароля.

6. Создание пользователя

При создании пользователя через API системные поля (группы, токен, служебные атрибуты) больше нельзя задать напрямую — защита от повышения привилегий.

7. Генерация токенов в админке

Административный метод массовой генерации токенов теперь требует авторизации в админке и защищён от подделки запросов (CSRF).

8. Код поля токена

Имя поля токена из настроек теперь проверяется перед подстановкой в запросы к базе — закрыта возможность инъекции через эту настройку.

9. Прочее

Удаление пользователя, демо-контроллер и заголовки ответа получили мелкие усиления.

Установка патча

1. Загрузка патча

Скачать patch.zip

2. Резервная копия

Перед установкой скопируйте папку модуля — на случай отката:

/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.phpID пользователя приводится к числу перед удалением
example.phpДемо-роут отдаёт только безопасные поля вместо всего $_SERVER
response.phpИз заголовков ответа вырезаются переводы строки