MiniShop3 1.14.2 - срочный securiy релиз и важное исправление доступов.

Вышел MiniShop3 1.14.2-beta1 — восемь исправлений, из которых шесть про безопасность, а одно вообще не давало работать: в админке магазина не мог ничего сделать никто, кроме первого пользователя сайта. Если у вас магазином занимается не владелец, а отдельный человек — обновляйтесь не раздумывая.

Работать в админке мог только первый администратор



К операциям магазина не допускался никто, кроме пользователя с неограниченным доступом. Права в системе были — все четырнадцать, на товары, категории, заказы, галерею и настройки, — но выдать их группе администраторов забыли. Поэтому у второго и любого следующего админа не работало ничего: ни сохранить товар или категорию, ни открыть список заказов, ни заглянуть в настройки магазина. Админка встречала его сообщениями вида «Access denied. Required permission: msproduct_save».

Владелец сайта проблемы не видел и видеть не мог: у первого пользователя стоит флаг sudo, а он пропускает проверку прав целиком. Поэтому всё и держалось до появления второго администратора. Причина историческая: в miniShop2 политику выдавали группе при установке, а при переносе на MiniShop3 эта половина потерялась.

Теперь установка и обновление сами выдают политику магазина всем группам, у которых уже есть доступ в админку — добавочной записью, так что собственные права группы остаются главнее. Перелогиниваться не нужно, права перечитываются сразу. Единственное: группа, созданная после установки, политику не получит — выдайте вручную либо переустановите пакет поверх.

Заказ можно было переписать с фронтенда



Публичное API принимало имя поля и значение и писало что угодно, если в черновике заказа есть такая колонка. Посетитель со своим токеном корзины мог записать в заказ чужого покупателя — и готовый заказ оказывался в чужом личном кабинете. Тем же путём открывались сумма, статус и номер заказа. Теперь служебные поля с фронтенда не пишутся, а поля формы и собственные колонки магазина работают как раньше.

Комментарий к заказу исполнялся на сервере



Самая неприятная находка релиза. Готовое письмо о заказе ещё раз прогонялось через разбор тегов, а с установленным pdoTools это полноценный Fenom — то есть всё, что покупатель написал в комментарии к заказу, уходило на сервер как шаблон. На стенде из комментария отрабатывали и чтение системных настроек, и вызов сниппета. Второй заход был через тему письма.

Починили так, чтобы не ломать чужие чанки писем: в самом шаблоне по-прежнему доступны и Fenom, и настройки, и лексиконы, и сниппеты — а данные покупателя остаются текстом. Заодно поля покупателя в штатных письмах стали экранироваться.

Хеш пароля и токены в письмах и кабинете



Личный кабинет и плейсхолдеры писем отдавали в шаблон всю строку покупателя целиком — вместе с хешем пароля, действующим токеном доступа и счётчиками входов. У заказа туда же уходил токен корзины, у способа доставки — его настройки, где у интеграций лежат ключи. Штатные чанки это не печатают, но любой свой шаблон мог. Теперь во все шаблоны уходит только публичный набор полей.

Подстановка в SQL в списках админки



Выпадающие списки покупателей и пользователей подставляли в запрос к базе идентификатор от клиента как есть, без приведения к числу — вместо идентификатора можно было передать кусок SQL. Нужен был вход в админку, так что случайный посетитель до списков не добирался, но полагаться на это не стоит.

Листинг товаров в категории перестал тормозить



В прошлом релизе перемудрили с проверкой прав: простая постраничная выборка превратилась в перебор всей категории, и список товаров стал открываться в десятки раз дольше — почти секунда на двух тысячах товаров, и тем хуже, чем дальше страница. В админке это было заметно глазом. Теперь страница снова берётся одним запросом: 24 миллисекунды вместо 950. Там, где видимость товаров действительно настроена через группы ресурсов, работает прежняя проверка — права важнее скорости.

Что стоит знать при обновлении



  • Токен покупателя теперь живёт сутки, а не неделю. В настройках пакета всегда стояло 24 часа, но код при отсутствии настройки в базе подставлял семь дней. Нужен недельный срок — задайте ms3_customer_token_ttl явно.
  • Шаблоны, которые печатали служебные поля, получат пустое значение. У способа доставки в письмах и кабинете остались название, описание, цена и логотип.
  • Свой фронтенд, выставлявший стоимость доставки напрямую, получит ошибку. Именно через эту дырку посетитель мог обнулить себе доставку.

Документация догоняет компонент



Параллельно с релизами идёт большая работа над документацией: 92 страницы в русском наборе и столько же в английском, с августа больше тридцати обновлений. Год вышел плотный — Web API, личный кабинет, уведомления, отгрузки, складской учёт, своя сборка грида, — и описания местами отставали от того, что уже работает в коде. Поэтому страницы сейчас проходят сверку с исходниками: параметры сниппетов, поля ответов API, плейсхолдеры чанков, примеры запросов.

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

В этот релиз попала сверка всех страниц, которых коснулись исправления выше. Работа не закончена, дальше остальные разделы — если заметите расхождение с кодом или просто непонятное место, пишите в issues, это сильно ускоряет дело.

Спасибо



Спасибо @Евгений Борисов за разбор и исправление утечки в чанках кабинета вместе с рассинхроном срока жизни токена покупателя.

Что дальше



Полный список изменений — в CHANGELOG, пакет — на странице релиза и в modstore. Что нашли или хотите — в issues.
Николай Савин
Николай Савин
8 часов назад
modx.pro
104

Комментарии: 2

Сергей Карпович
2 часа назад
Обнаружил проблему с Конфигурацией гридов «Товары категории».
Добавляю в грид свое кастомное поле (msProductData), ставлю отметку «редактируемое» и наблюдаю 2 проблемы:
1. в колонку не подтягиваются значения из базы, то есть колонка пустая, хотя это поле у товаров заполнено
2. при записи что то в поле через грид не сохраняется в базу.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
2