MiniShop3 1.14.2 - срочный securiy релиз и важное исправление доступов.
Вышел MiniShop3 1.14.2-beta1 — восемь исправлений, из которых шесть про безопасность, а одно вообще не давало работать: в админке магазина не мог ничего сделать никто, кроме первого пользователя сайта. Если у вас магазином занимается не владелец, а отдельный человек — обновляйтесь не раздумывая.
К операциям магазина не допускался никто, кроме пользователя с неограниченным доступом. Права в системе были — все четырнадцать, на товары, категории, заказы, галерею и настройки, — но выдать их группе администраторов забыли. Поэтому у второго и любого следующего админа не работало ничего: ни сохранить товар или категорию, ни открыть список заказов, ни заглянуть в настройки магазина. Админка встречала его сообщениями вида «Access denied. Required permission: msproduct_save».
Владелец сайта проблемы не видел и видеть не мог: у первого пользователя стоит флаг sudo, а он пропускает проверку прав целиком. Поэтому всё и держалось до появления второго администратора. Причина историческая: в miniShop2 политику выдавали группе при установке, а при переносе на MiniShop3 эта половина потерялась.
Теперь установка и обновление сами выдают политику магазина всем группам, у которых уже есть доступ в админку — добавочной записью, так что собственные права группы остаются главнее. Перелогиниваться не нужно, права перечитываются сразу. Единственное: группа, созданная после установки, политику не получит — выдайте вручную либо переустановите пакет поверх.
Публичное API принимало имя поля и значение и писало что угодно, если в черновике заказа есть такая колонка. Посетитель со своим токеном корзины мог записать в заказ чужого покупателя — и готовый заказ оказывался в чужом личном кабинете. Тем же путём открывались сумма, статус и номер заказа. Теперь служебные поля с фронтенда не пишутся, а поля формы и собственные колонки магазина работают как раньше.
Самая неприятная находка релиза. Готовое письмо о заказе ещё раз прогонялось через разбор тегов, а с установленным pdoTools это полноценный Fenom — то есть всё, что покупатель написал в комментарии к заказу, уходило на сервер как шаблон. На стенде из комментария отрабатывали и чтение системных настроек, и вызов сниппета. Второй заход был через тему письма.
Починили так, чтобы не ломать чужие чанки писем: в самом шаблоне по-прежнему доступны и Fenom, и настройки, и лексиконы, и сниппеты — а данные покупателя остаются текстом. Заодно поля покупателя в штатных письмах стали экранироваться.
Личный кабинет и плейсхолдеры писем отдавали в шаблон всю строку покупателя целиком — вместе с хешем пароля, действующим токеном доступа и счётчиками входов. У заказа туда же уходил токен корзины, у способа доставки — его настройки, где у интеграций лежат ключи. Штатные чанки это не печатают, но любой свой шаблон мог. Теперь во все шаблоны уходит только публичный набор полей.
Выпадающие списки покупателей и пользователей подставляли в запрос к базе идентификатор от клиента как есть, без приведения к числу — вместо идентификатора можно было передать кусок SQL. Нужен был вход в админку, так что случайный посетитель до списков не добирался, но полагаться на это не стоит.
В прошлом релизе перемудрили с проверкой прав: простая постраничная выборка превратилась в перебор всей категории, и список товаров стал открываться в десятки раз дольше — почти секунда на двух тысячах товаров, и тем хуже, чем дальше страница. В админке это было заметно глазом. Теперь страница снова берётся одним запросом: 24 миллисекунды вместо 950. Там, где видимость товаров действительно настроена через группы ресурсов, работает прежняя проверка — права важнее скорости.
Параллельно с релизами идёт большая работа над документацией: 92 страницы в русском наборе и столько же в английском, с августа больше тридцати обновлений. Год вышел плотный — Web API, личный кабинет, уведомления, отгрузки, складской учёт, своя сборка грида, — и описания местами отставали от того, что уже работает в коде. Поэтому страницы сейчас проходят сверку с исходниками: параметры сниппетов, поля ответов API, плейсхолдеры чанков, примеры запросов.
Второе направление — сам текст. Писали мы его, по сути, для себя: вышло сухо, перегружено терминами, местами так, что без исходников под рукой и не разберёшься. Сейчас упрощаем формулировки, приводим к одному словарю терминологию (админка, а не менеджер, фронтенд, а не витрина, названия разделов — как они подписаны в самой админке) и разбавляем текст схемами и скриншотами интерфейса: схем в наборе уже больше двадцати, скриншоты добавляем по мере прохода по разделам.
В этот релиз попала сверка всех страниц, которых коснулись исправления выше. Работа не закончена, дальше остальные разделы — если заметите расхождение с кодом или просто непонятное место, пишите в issues, это сильно ускоряет дело.
Спасибо @Евгений Борисов за разбор и исправление утечки в чанках кабинета вместе с рассинхроном срока жизни токена покупателя.
Полный список изменений — в CHANGELOG, пакет — на странице релиза и в modstore. Что нашли или хотите — в issues.
Работать в админке мог только первый администратор
К операциям магазина не допускался никто, кроме пользователя с неограниченным доступом. Права в системе были — все четырнадцать, на товары, категории, заказы, галерею и настройки, — но выдать их группе администраторов забыли. Поэтому у второго и любого следующего админа не работало ничего: ни сохранить товар или категорию, ни открыть список заказов, ни заглянуть в настройки магазина. Админка встречала его сообщениями вида «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.
Техническая поддержка MODX
Сайт лежит, тормозит или остался без разработчика?
Переезд с MODX 2 на 3, PHP 7 на 8, скорость и безопасность. Поддержка со сроками и ответственностью, а не совет в чате.
Подробнее
Реклама
0
Комментарии: 0