report · Конструктор отчетов 26.200.100 Безопасность

Report 26.200.100: закрыта SQL-инъекция через формат имени пользователя

2 мин чтения
Узнавайте о ломающих изменениях Битрикса раньше, чем они доедут до прода: свежие разборы — в канале @bxmax_updates

Обновление безопасности

Закрыта уязвимость или ослабленная проверка прав. Ставить в первую очередь.

Релиз «Конструктора отчётов» вендор описал фразой «Усилена безопасность модуля». На деле изменилась одна строка в CReport::getFormattedNameExpr(), теперь метод экранирует литералы из формата имени пользователя перед вставкой в SQL. Если модуль report установлен, обновите его до 26.200.100. Файл пошагового экспорта report.view/stexport.ajax.php отвечает на прямой запрос, поэтому неважно, пользуются ли выгрузкой на сайте.

Метод разбирает формат вида #LAST_NAME# #NAME_SHORT# на плейсхолдеры и литералы между ними и склеивает из них SQL-выражение для ФИО. Литералы вставлялись строковыми константами без экранирования, теперь их пропускают через ForSql():

        -$expression[] = "'".$match."'";
+$expression[] = "'".$DB->ForSql($match)."'";

    

Формат приходит в метод через CReport::rewriteUserShortName() из компонента bitrix:report.view, параметр USER_NAME_FORMAT. Пошаговый экспорт (report.view/stexport.ajax.php) берёт параметры компонента, в том числе USER_NAME_FORMAT, из $_REQUEST['PARAMS']['COMPONENT_PARAMS']. Так литеральная часть формата могла прийти из запроса и попасть в SQL-выражение поля SHORT_NAME.

До правки формат проходил только через str_replace('%', '%%', ...). Это защищает sprintf-подстановку в выражении ORM, но не кавычки. Если вы сами собираете ExpressionField с литералом из настроек или запроса, нужны оба шага:

        <?php declare(strict_types=1);

use Bitrix\Main\Application;
use Bitrix\Main\ORM\Fields\ExpressionField;
use Bitrix\Main\UserTable;

$helper = Application::getConnection()->getSqlHelper();
$rawSeparator = (string) Application::getInstance()->getContext()->getRequest()->get('sep');

// convertToDbString() экранирует и берёт в кавычки, %% нужен для sprintf внутри ExpressionField
$separator = str_replace('%', '%%', $helper->convertToDbString($rawSeparator));

$users = UserTable::query()
    ->setSelect(['ID', 'SHORT_NAME'])
    ->registerRuntimeField(new ExpressionField(
        'SHORT_NAME',
        $helper->getConcatFunction('%s', $separator, '%s'),
        ['LAST_NAME', 'NAME'],
    ))
    ->fetchAll();

    

Если склеивать ФИО в SQL незачем, выберите LAST_NAME и NAME через UserTable и соберите строку в PHP, тогда литерал в запрос не попадёт.

SQL-инъекцию в этом модуле закрывали и в прошлом релизе: report 26.200.0.

Новая версия вышла — разбор уже в Telegram

В канале @bxmax_updates публикуем каждый свежий разбор: что сломается, что устарело и что появилось в API. Узнаете до того, как обновите прод.

Подписаться

Читайте дальше

report 26.200.0 Безопасность Свежее

Report 26.200.0: белый список агрегатов против SQL-инъекции и самопочинка дат в фильтрах

В модуле конструктора отчётов `report` закрыта SQL-инъекция через агрегатную функцию из настроек отчёта, которая попадала в запрос без проверки. Ещё одна правка чинит отчёты, которые падали при каждом открытии из-за даты с годом вне диапазона БД, и ради этого `report.view` может сам переписать `b_re…

2 мин
timeman 26.350.0 Заметное Свежее

Timeman 26.350.0: план дня пишется в нужную запись, блоки БП возвращают Saved

В timeman 26.350.0 для коробочного Битрикс24 блоки «Сохранить план на день» и «Сохранить отчёт сотрудника за день» из нового конструктора бизнес-процессов научились писать в заданную запись рабочего дня, оставлять Markdown как есть и сообщать, сохранилось ли (у отчёта новые настройки в конструкторе,…

2 мин
rpa 26.300.0 Безопасность Свежее

Rpa 26.300.0: права на перемещение элементов наконец проверяются

До RPA 26.300.0 `UserPermissions::canMoveItem()` сразу отвечал `true`, и любой сотрудник, кроме экстранет-пользователей, мог перетащить любой элемент на любую стадию, а права стадии на перемещение не учитывались. Теперь права проверяются, а тем, кто может только смотреть, `rpa.item.get` и `rpa.item….

3 мин
booking 26.500.100 Заметное Свежее

Booking 26.500.100: addList отвечает ошибкой, когда не создал ни одной брони, а четыре колонки дат стали DATETIME

В коробочный Битрикс24 пришёл booking 26.500.100 с двумя правками. AJAX-экшен `booking.api_v1.Booking.addList` теперь возвращает ошибку, если не создал ни одной брони. Апдейтер переводит четыре колонки дат с `TIMESTAMP` на `DATETIME`, и в `install/migrations/tables.php` они объявлены через `datetime…

3 мин
Мы используем файлы cookie для улучшения работы сайта. Продолжая использовать сайт, вы соглашаетесь с нашей политикой конфиденциальности.
AI Домовой

AI Домовой История

на связи

пишет…
Нет истории чатов
AI Домовой

Нужна авторизация

Войдите, чтобы задавать вопросы AI Домовому.

Войти