Skip to content

fix(security): allowlist sort и dir в combo-списке товаров - #932

Merged
biz87 merged 1 commit into
betafrom
fix/issue-919-product-getlist-sort
Oct 18, 2026
Merged

biz87 merged 1 commit into
betafrom
fix/issue-919-product-getlist-sort

Conversation

@Ibochkarev

Copy link
Copy Markdown
Member

Описание

Legacy-процессор Product/GetList подставлял sort и dir в ORDER BY. xPDO в sortby() отсекает только ;, union, sleep и benchmark, поэтому запятая и подзапрос проходили. Достаточно любой сессии менеджера: у процессора нет $permission.

ProductComboSort принимает направление только как ASC или DESC. menuindex по-прежнему сортирует как parent, затем menuindex. Остальные поля берутся из фиксированного списка колонок msProduct. Любое другое значение заменяется на ветку menuindex и в SQL не попадает.

Разрешение msproduct_list не добавлял: такого ключа нет в политике, и smoke-тест #672 специально оставляет процессор без permission. Фильтр document ACL на строки combo тоже не делал: после LIMIT он ломает total. Те же fallback в Gallery/GetList, Customer/GetList и Customer/Address/GetList в этот PR не входят.

Сортировка по полю Data.* (например article) теперь падает в menuindex. Combo выбирает только id, pagetitle и context_key.

Тип изменений

  • Исправление бага (non-breaking change)
  • Новая функциональность (non-breaking change)
  • Breaking change (изменение, ломающее обратную совместимость)
  • Рефакторинг (без изменения функциональности)
  • Документация
  • Другое (опишите):

Связанные Issues

Closes #919

Как это было протестировано?

  • php -l на изменённых PHP-файлах.
  • ProductComboSortTest: allowlist, мусор в sort/dir, и реальный xPDOQuery 3.1.7 (ORDER BY msProduct.parent DESC, msProduct.menuindex DESC и ORDER BY msProduct.\pagetitle` ASC`).
  • ProcessorPermissionsSmokeTest.

composer ci:php прогнан. Три падения в HeadlessStorefrontErrorsTest (401/400 вместо 200/500, токен корзины) к этому diff не относятся. PHPStan и ESLint не запускал: Vue не менялся.

  • Ручное тестирование
  • Автоматические тесты (composer ci:php / composer test, npm run lint:ci, composer stan / GitHub Actions CI)
  • Тестирование на разных версиях PHP/MODX

Конфигурация тестирования:

  • MiniShop3: ветка fix/issue-919-product-getlist-sort от beta (7f26ddb6)
  • MODX: не поднимался. xPDO взят из .phpstan-deps (xpdo 3.1.7)
  • PHP: 8.2+

Скриншоты (если применимо)

До После

Чеклист

  • Код соответствует стилю проекта
  • Добавлены/обновлены комментарии в сложных местах
  • Изменения не ломают существующую функциональность
  • Лексиконы добавлены на двух языках (ru/en)
  • PHPStan проходит без новых ошибок (composer stan / CI job PHPStan)
  • ESLint проходит без ошибок (npm run lint:ci для Vue)
  • Обновлён CHANGELOG.md (для значимых изменений)

Дополнительные заметки

Новых строк для пользователя нет, лексиконы не трогал. CHANGELOG по правилам репозитория пишется на релизе.

ProductComboSort лежит рядом с процессором, поэтому smoke-тест разрешений видит его как процессор. В allowlist добавлена запись, что это не процессор, а разбор сортировки.

Готового payload в описании и в тестах нет: тест отбрасывает строку с запятой и скобками и проверяет, что она не попала в выражение.

)

xPDO в sortby пропускает запятую и подзапрос, поэтому параметры combo-процессора доходили до ORDER BY.
@Ibochkarev
Ibochkarev requested a review from biz87 October 18, 2026 17:23
@biz87
biz87 merged commit ed4213c into beta Oct 18, 2026
6 checks passed
@biz87
biz87 deleted the fix/issue-919-product-getlist-sort branch October 18, 2026 21:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] SQL-инъекция через sort и dir в legacy-процессоре Product/GetList

2 participants