Skip to content

[Bug] Плейсхолдеры письма отдают token заказа, пароль покупателя и properties доставки #889

Closed

Description

@Ibochkarev

Описание проблемы

Сборка плейсхолдеров уведомления кладёт в шаблон полный toArray() заказа, покупателя и доставки. В заказе на верхнем уровне и в {\$order} остаётся token. У покупателя в массиве есть password и token. У доставки в properties лежат секреты вроде ключа webhook.

Оплата в том же методе уже режется через PaymentPublicFields. Заказ, покупатель и доставка нет.

Штатные чанки эти ключи не печатают. Любой шаблон, выбранный в UI уведомлений, может их вывести.

Шаги воспроизведения

  1. Создать чанк уведомления и вывести в нём {\$token}, {\$customer.password} или {\$delivery.properties}.
  2. Привязать чанк к смене статуса, канал email.
  3. Сменить статус заказа с покупателем и доставкой.
  4. Открыть письмо.

Ожидаемое поведение

В шаблон попадают те же публичные поля, что в кабинете через CustomerPublicDto и в менеджере, где token заказа вырезают. Секрет доставки и hash пароля в письмо не входят.

Фактическое поведение

Notification::getPlaceholders():

\$pls = \$orderData;
\$pls['order'] = \$orderData;
\$pls['customer'] = \$customer->toArray();
\$pls['delivery'] = \$delivery->toArray();
\$pls['payment'] = PaymentPublicFields::fromEntityOrEmpty(\$payment);

\$orderData это msOrder::toArray(), включая token. msCustomer::toArray() включает password и token.

Тот же полный массив покупателя уходит в получателя в OrderStatusService при разборе уведомления.

Скриншоты

Не требуются.

Окружение

  • MiniShop3: 1.14.1-beta2
  • MODX: 3.x
  • PHP: 8.2+
  • MySQL: не зависит
  • Браузер: не зависит

Логи ошибок

Логи из core/cache/logs/error.log
Ошибки нет. Секреты видны только если чанк их печатает.

Дополнительный контекст

Файлы: src/Notifications/Notification.php, метод getPlaceholders(). src/Services/Order/OrderStatusService.php кладёт \$customer->toArray() в получателя.

Это не #840. Там hash пароля и token попадают в Fenom-страницы кабинета. Здесь путь исходящего письма.

Предложение: из заказа убрать token, покупателя отдавать через CustomerPublicDto, у доставки не передавать properties и class.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingphpPull requests that update php codepriority: highВажно исправить в ближайшее время

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions