Как починить пагинацию в своих расширениях для Joomla 5.1.3+. Backwards breaking changes

от автора

Это информация о возможном сломе обратной совместимости в классе Pagination Joomla 5.1.3+. Релиз 5.1.3 был связан с закрытием уязвимостей (см. Joomla 5.1.3 and 4.4.7 Security and Bug Fix Release), в нём был изменён подход к генерации ссылок для страниц пагинации. Из-за этого могут перестать работать ссылки страниц пагинации в сторонних компонентах Joomla. В компонентах ядра ошибки работы пагинации были исправлены в релизе 5.1.4.

Как было?

До сих пор ссылки на отдельные страницы, а также ссылки на страницы «В начало», «В конец», «Вперед» и «Назад» автоматически включали все параметры запроса, которые присутствуют в текущем запросе ($app->getInput()). Такое поведение создает возможность вектора атаки злоумышленников на заражение кэша.

Как стало?

Чтобы смягчить этот фактор, пришлось внести изменения в поведение класса Pagination. Класс разбивки на страницы по умолчанию будет включать только следующие параметры запроса в процесс генерации URL-адреса:

<?php // @see \Joomla\CMS\Pagination\Pagination::_buildDataObject  $defaultUrlParams = [             'format'        => 'CMD',             'option'        => 'CMD',             'controller'    => 'CMD',             'view'          => 'CMD',             'layout'        => 'STRING',             'task'          => 'CMD',             'template'      => 'CMD',             'templateStyle' => 'INT',             'tmpl'          => 'CMD',             'tpl'           => 'CMD',             'id'            => 'STRING',             'Itemid'        => 'INT',         ]; 

Если этих параметров достаточно для формирования корректного URL с помощью Route::_(), то можно ничего не менять. Если вам нужны нетипичные параметры (например, project_id, cat_id, product_id и т.д.), то их следует добавить в объект пагинации в методе display() вашего View.

<?php use Joomla\CMS\Factory;  \defined('_JEXEC') or die;  public function display($tpl = null) {       $app = Factory::getApplication();      $this->pagination = $this->get('Pagination');       // Flag indicates to not add limitstart=0 to URL      $this->pagination->hideEmptyLimitstart = true;       // Add additional parameters to pagination url      $queryParameterList = [                'catid'      => 'int',                'project_id' => 'int',                'language'   => 'string',      ];       foreach ($queryParameterList as $parameter => $filter)      {           $value = $app->getInput()->get($parameter, null, $filter);            if (is_null($value))                {                     continue;                }            $this->pagination->setAdditionalUrlParam($parameter, $value);      }       // Остальное содержимое метода } 

Обратите внимание, что для каждого параметра нужно указать тип фильтра (официальная документация Joomla Input — Introduction): int, string, cmd, word и т.д.

Также примеры для com_finder и com_content на GitHub

Полезные ресурсы

Ресурсы сообщества:

Telegram:


ссылка на оригинал статьи https://habr.com/ru/articles/844296/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *