landing · Сайты 24 26.900.0 Безопасность

landing 26.900.0: undo/redo закрыли от инъекции PHP, execute стал final

1 мин чтения Устаревших API: 1

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

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

Главное в релизе — не новые фичи, а ужесточение истории правок. Действия undo/redo теперь проходят обязательную проверку на PHP-открывающий тег, а метод execute() сделан final, чтобы проверку нельзя было обойти переопределением. Плюс удалён контроллер AiBlocks, появившийся всего два релиза назад.

История правок: gate, который нельзя обойти

BaseAction::execute() стал final и делегирует в protected doExecute(). У всех конкретных действий execute переименован в doExecute. Перед делегированием стоит проверка:

        final public function execute(bool $undo = true): bool
{
    if (ActionParamsGuard::containsUnneutralizedPhpOpenTagDeep($this->params)) {
        return false;
    }
    // ... XSS-аудит объявленных HTML-ключей
    return $this->doExecute($undo);
}

    

Новый ActionParamsGuard::containsUnneutralizedPhpOpenTagDeep() рекурсивно обходит всё дерево параметров действия, включая вложенные MULTIPLY-элементы, и ищет неэкранированный <? в любом строковом листе. Комментарии в коде называют это fail-closed RCE-маркером, а final объясняют прямо: ни один шаг не должен дойти до своего сток-метода в обход гейта.

Почему это важно понимать, а не просто поставить обновление. История правок лендинга — это сохранённые параметры действий, которые потом применяются заново. Всё, что доехало до записи в историю, рано или поздно будет исполнено при откате. Значит, история — такой же вход недоверенных данных, как форма, только с отложенным исполнением. И final здесь не про стиль: любой наследник, переопределивший execute(), автоматически становился дырой, поэтому возможность переопределения убрали физически.

Тот же мотив рядом: в публичном просмотре (landing.pub/class.php) появились getDevicePreviewParentOrigin() и sanitizeOrigin() — query-параметр landing_device_preview принимается только в виде scheme://host[:port], без путей и лишнего. Плюс JS device_preview/responder.js и sandbox_shim.js.

Что сломается

  • BaseAction::execute() — final. Свои действия истории с переопределённым execute не соберутся. Переносите логику в doExecute(); это ровно то, чего от вас хотят — тело действия под гейтом, а не вместо него.
  • Controller\AiBlocks удалён целиком (экшены magicSiteStart/Resume/Status, changeAiSiteStart/Resume/Status, convert). В Controller\Copilot добавились configureActions() и magicSiteStatusAction. Контроллер прожил ровно от 26.700.0 до 26.900.0 — хорошая иллюстрация, почему на свежие AI-контроллеры не стоит завязываться сразу.
  • Удалены AI\SiteBuilder\Dto\DevContextDto, Service\DevContextService, Storage\ContextStorageInterface, Storage\OptionContextStorage — тоже приехали в 26.700.0 и тоже прожили два релиза.

В api.diff много изменений сигнатур Block::*, но это в основном косметика: array() → [], уточнение типов до ?string / ?Landing. getLandingRowByBlockId по-прежнему @deprecated.

Модерация темы и подбор домена

Развитие AI-сайтов продолжается:

  • Модерация: Dto\ModerationVerdictDto с тремя состояниями (isAllowed, isHardBlock, isSoftBlock), схема Copilot\Connector\Schema\AiSiteModerationVerdict, шаги RequestModerateAiSiteTopic и RequestModerateChangeAiSiteTopic. Тема сайта проверяется до генерации. Три состояния вместо булева — это возможность «мягко» притормозить сомнительное, а не только рубить.
  • Домен: AI\SiteBuilder\Domain\AiSiteDomainPicker, шаг TaskResolveAiSiteDomain, у EnhancedInputDto появились getAiDomains(), getCategory(), getTitle(). Адрес сайта тоже подбирается генерацией.
  • Починка блоков: Copilot\Services\AiBlockLazyRepairService, HtmlBlock\CoverageRepairer, Manifest\RepoManifestMerger, HtmlBlock\NodeTagger::tagLeafTextNodes(). Сгенерированная разметка не всегда полностью корректна с точки зрения редактора — эти классы приводят её в рабочий вид уже после генерации.
  • Тулы ассистента: SearchDeletedLandingSitesTool и RestoreLandingSiteTool — поиск и восстановление удалённых сайтов.

Схема БД не менялась.

Что делать

  1. Свои History\Action — переименовать execute в protected doExecute, иначе модуль не встанет.
  2. Найти обращения к Controller\AiBlocks и DevContext* — этого больше нет.
  3. Если вы делаете свою систему undo/redo с сохранением параметров — посмотрите на ActionParamsGuard как на образец: отложенное применение сохранённого ввода требует проверки на входе И на применении.

Устаревшие и удалённые API в этой версии

Символ Статус Чем заменять
Bitrix\Landing\Controller\AiBlocks Удалено —

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

landing 26.1200.0 Безопасность Свежее

Landing 26.1200.0: подписанный предпросмотр ушёл в CSP-песочницу, а импорт с заменой сайта помечает старые страницы удалёнными

Landing 26.1200.0 трогает 690 файлов, но основная масса там картинки, переводы и пересобранные бандлы. Релиз закрывает дыры в подписанной ссылке предпросмотра, чинит импорт с заменой сайта и размечает для скринридеров интерфейсы прав, настроек и редактора. Если вы вызываете `AiSiteChatAvailabilitySe...

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

Landing 26.1100.0: закрыта цепочка уязвимостей, заодно ужесточены repo.register, savePicture и проверка ссылок предпросмотра

`landing` 26.1100.0 (сборка от 06.08.2026) почти целиком про безопасность. Закрыты исполнение кода через манифест repo-блока и импорт архива сайта, инъекция в `eval()` через CODE страницы, SSRF через обработчик виджета, XSS в выводе ассетов, предсказуемый в облаке md5-хеш предпросмотра. В комментари...

14 мин
landing 26.1100.100 Рутинное Свежее

Landing 26.1100.100: только номер версии

В `install/version.php` поменялись номер версии и дата сборки (20 августа), больше в релизе ничего нет. Следом идёт [landing 26.1100.200](/bitrix-updates/landing/landing-26-1100-200) с содержательной правкой контроллера файлов Диска.

1 мин
landing 26.1100.200 Безопасность Свежее

Landing 26.1100.200: контроллер файлов Диска требует авторизацию и наконец отвязался от удалённого Block::isContains

Контроллер `Bitrix\Landing\Controller\DiskFile`, через который блоки Сайтов отдают файлы Диска, получил префильтры и проверку права на чтение страницы. Заодно он перестал вызывать `Block::isContains()`, который удалили ещё в 26.1000.0. Публичные сигнатуры и БД не менялись.

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

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

на связи

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

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

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

Войти