landing · landing 26.900.0 Безопасность

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

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 как на образец: отложенное применение сохранённого ввода требует проверки на входе И на применении.

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

landing 26.700.0 Заметное Свежее

landing 26.700.0: Copilot-чат для сайтов снят, генерация переехала на Tailwind

Модуль лендингов развернул подход к генерации сайтов: отдельный чат-бот Copilot удалён вместе с публичными экшенами, а вместо него — сборка страницы Tailwind-блоками и набор инструментов для AI-ассистента. Релиз ломающий: удалены и AJAX-экшены, и целые классы, и часть шагов генерации переехала в дру...

4 мин
landing 26.800.0 Заметное Свежее

landing 26.800.0: ассистент умеет публиковать сайт, установщик — на миграциях

Небольшой релиз с одним ломающим краем: у AI-ассистента появился инструмент публикации сайта, у инструментов — логирование вызовов, а установщик модуля переехал на `UpdateSystem\Migration`. Ломается ровно один метод — и ломается тихо.

3 мин
seo 26.100.0 Заметное Свежее

seo 26.100.0: админку Google Webmaster вырезали, VK включается по зоне портала

Релиз про сокращение того, что перестало работать. Раздел Google Webmaster Tools в админке убран целиком, deprecated-метод Яндекса удалён, интеграции с VK теперь отключаются по региону портала. Плюс установщик переведён на миграции ядра.

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

sender 26.300.0: тестер писем больше не пускает произвольные ключи в компилятор

Главное в этом релизе — не новые классы, а два фильтра. AJAX тестовой отправки письма перестал складывать в конфигурацию сообщения всё, что пришло в запросе, а редирект по ссылке из рассылки перестал таскать внутренний параметр на внешние домены. Обе правки маленькие, обе — про то, что раньше можно...

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

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

на связи

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

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

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

Войти