sender 26.300.0: тестер писем больше не пускает произвольные ключи в компилятор
Обновление безопасности
Закрыта уязвимость или ослабленная проверка прав. Ставить в первую очередь.
Главное в этом релизе — не новые классы, а два фильтра. AJAX тестовой отправки письма перестал складывать в конфигурацию сообщения всё, что пришло в запросе, а редирект по ссылке из рассылки перестал таскать внутренний параметр на внешние домены. Обе правки маленькие, обе — про то, что раньше можно было сделать с портала снаружи.
Тестер писем: array_intersect_key вместо доверия запросу
В sender.message.tester/ajax.php данные из клиентского запроса уходили в setConfigurationData() целиком. Конфигурация сообщения — это то, из чего собирается письмо, и часть её ключей интерпретируется как код. Комментарий, который разработчики оставили в новом коде, называет вещи своими именами: ключи вроде BODY_PHP не должны попадать в компилятор писем из клиентского запроса.
Теперь перед передачей стоит белый список:
$letter->getMessage()->setConfigurationData(
array_intersect_key($messageData, $allowedOptionCodes)
);
Всё, чего нет среди кодов опций конфигурации, отбрасывается. Если вы держите sender на портале с доступом у нескольких сотрудников — это обновление стоит поставить не откладывая.
Conversion-параметр перестал утекать на внешние домены
Новый класс Bitrix\Sender\Internals\ExternalUrlSanitizer вешается на событие main:OnMailEventMailClickRedirect и снимает query-параметр bx_sender_conversion_id с URL, если редирект ведёт на внешний хост. Внутри портала параметр нужен — по нему считается конверсия. За его пределами это просто идентификатор из вашей рассылки, который уезжает в чужую аналитику и реферер.
Отдельно стоит посмотреть, как санитайзер определяет «свой» домен: он берёт BX24_HOST_NAME, опцию main.server_name и SiteDomainTable — и не смотрит в HTTP_HOST. Это защита от подмены заголовка Host: иначе достаточно было бы прислать чужой Host, чтобы внешняя ссылка считалась своей и параметр уехал вместе с переходом.
Заодно литерал bx_sender_conversion_id из ConversionHandler::onBeforeProlog() заменён на константу ExternalUrlSanitizer::CONVERSION_PARAM — теперь имя параметра в одном месте.
Что сломается
Bitrix\Sender\SenderNotifySchema. Схема IM-уведомлений обёрнута в ключиNAMEиNOTIFY; раньшеgroup_preparedлежал прямо подsender. Если вы разбирали эту схему или дополняли её своими типами — путь изменился.- VK-реклама режется по региону.
TransportVkиTransportLookalikeVkпопадают в список транспортов только приBitrix24\Service::isAdVisibleInRegion(), аMessage\Adapter::isAvailable()для кодовCODE_ADS_VK/CODE_ADS_LOOKALIKE_VKвозвращаетfalseтам, где регион эти объявления скрывает. Код, который жёстко предполагал наличие VK-транспорта, получит пустоту вместо ошибки — проверяйтеisAvailable(). - Тестер писем может начать «терять» ключи, если вы дописывали в него свои — теперь они должны быть зарегистрированы как коды опций конфигурации.
Установщик переехал на миграции
InstallDB / UnInstallDB больше не гоняют SQL-батчи: удалены install/db/{mysql,pgsql}/install.sql, install_ft.sql, uninstall.sql, а схема описана в install/migrations/tables.php (включая fulltext-индекс IXF_B_SENDER_MAILING_CHAIN_1 на SEARCH_CONTENT). События — в events.php, агент AccessInstaller::installAgent() и степпер SetFileInfoStepper — в agents.php.
Новых таблиц и полей в релизе нет: схема переехала один в один. На работающем портале мигрировать нечего. Подробнее про механику — в отдельном разборе UpdateSystem\Migration.
Что делать
- Обновиться, если
senderиспользуется — из-за фильтра тестера. - Проверить свой код на разбор
SenderNotifySchema. - Если строите список каналов рассылки динамически — опираться на
Adapter::isAvailable(), а не на константы кодов.