Skip to content

[Bug] Страницы кабинета отдают в чанк password hash и msCustomer.token — как #410, но в Fenom #840

Closed

Description

@biz87

Проблема

#410 чинил ровно это для Web API: $customer->toArray() отдавал наружу password и token. Тогда завели CustomerPublicDto::PUBLIC_FIELDS и закрыли JSON-ответы.

Страницы личного кабинета на Fenom остались как были. Все три сервиса кладут в чанк сырой toArray():

// src/Services/Customer/ProfilePageService.php:30
$customerData = $this->customer->toArray();
...
return ['customer' => $customerData, ...];

То же в OrdersPageService.php:161, 226, 401, 456 и AddressesPageService.php:44, 192, 225, 270.

В карте msCustomer есть оба секрета:

// src/Model/mysql/msCustomer.php:24-25
'token' => '',
'password' => null,

То есть {$customer.password} (bcrypt-хеш) и {$customer.token} доступны любому чанку кабинета.

Чем это отличается от #410

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

Но:

  • хеш и токен оказываются в одном шаге от вывода: {$customer | print_r} при отладке, забытый {$customer.token} в разметке, свой чанк от стороннего разработчика;
  • на кэшируемом ресурсе отрисованный HTML попадает в кэш страницы — а кабинет по недосмотру кэшируемым оказывается легко;
  • msCustomer.token после путей checkout может совпадать с API-токеном покупателя (#369), то есть цена ошибки выше, чем у обычного поля.

Заодно: в заказах тот же сырой вывод

OrdersPageService.php:203-215 отдаёт в чанк $order.token, $order.idempotency_key, а также полные $delivery и $address без фильтрации. Allowlist применён только к $payment — PaymentPublicFields.

Что предлагается

Применить существующий CustomerPublicDto::PUBLIC_FIELDS в трёх сервисах страниц — решение уже написано и проверено на Web API, дублировать логику не нужно.

Отдельно стоит решить, что делать с $order.token и $order.idempotency_key: по образцу PaymentPublicFields завести allowlist и для заказа с доставкой.

Ломающих изменений почти нет: чанк, который сегодня выводит password или token, работает не так, как задумано.

Затрагиваемые файлы

  • core/components/minishop3/src/Services/Customer/ProfilePageService.php:30, 43
  • core/components/minishop3/src/Services/Customer/OrdersPageService.php:161, 203-215, 226, 401, 456
  • core/components/minishop3/src/Services/Customer/AddressesPageService.php:44, 192, 225, 270
  • core/components/minishop3/src/Model/mysql/msCustomer.php:24-25 — поля
  • готовый allowlist: CustomerPublicDto::PUBLIC_FIELDS

Найдено при сверке документации с кодом для страницы snippets/mscustomer.

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