Публичные действия в контроллерах администратора


Я обнаружил, что в классе \Magento\Backend\App\AbstractAction (предок каждого действия контроллера администратора) есть член с именем _publicActions, который используется для проверки секретного ключа следующим образом:

 if (is_array($this->_publicActions) && in_array($this->getRequest()->getActionName(), $this->_publicActions)) {
     return true;
 }

Это означает, что если определенное имя действия указано в _publicActions, вы можете получить доступ к действию без секретного ключа в URL.
Это благословение для разработки и отладки, потому что вы можете просто сделать это, как ROOT/admin/module/controller/action вручную, без необходимости знать секретного администратора ключ, но чего я не понимаю, так это почему я могу получить доступ к странице редактирования продукта без секретного ключа.
Просто позвоните на любую страницу редактирования продукта, как это ROOT/admin/catalog/product/edit/id/{product_id_here}.

Элемент publicActions перезаписывается для заказов (которые позволяют индексировать и просматривать), в продуктах (для редактирования) и в контроллере перенаправления для перенаправлений.

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

Author: Marius, 2016-07-18

2 answers

Я никогда не видел официального ответа инженера Magento по этому вопросу, но мне всегда казалось, что эта функция должна использоваться, когда вы хотите, чтобы пользователи могли ссылаться на страницу вне защищенного сеанса, так как в противном случае нажатие на ссылку, ссылающуюся на безопасный URL-адрес администратора, перенаправит вас на панель мониторинга только после запроса на вход.

Я всегда имел в виду два сценария: либо вы хотите, чтобы пользователи могли делиться определенными страницами администратора с другими пользователями, либо вы хотите, чтобы какая-нибудь общедоступная страница ссылалась на ваш пользовательский URL-адрес в серверной части Magento (которая в противном случае перенаправлялась бы только на панель мониторинга).

Когда вы посмотрите на ядро Magento, вы увидите, что Magento, по сути, реализовал это для обзоров, заказов и страниц продуктов. Я полагаю, что инженеры Magento сделали это, чтобы пользователи-администраторы магазина могли отправлять ссылки напрямую через мессенджер или по электронной почте (например, "Эй, проверьте этот заказ: [url]."). Однажды я реализовал такую функцию, как это для страницы, когда я хотел, чтобы она была легко доступна пользователям-администраторам.

Вы, по сути, обмениваете повышенный риск атаки CSRF на свободу прямой ссылки на страницу в серверной части вашего администратора, что следует делать только в том случае, если у вас есть очень определенный вариант использования. Я полагаю, что страницы CMS не попали в прецедент для основной команды Magento, поскольку они, похоже, ограничили эту "функцию" действиями, связанными с поддержкой клиентов и редактированием продуктов - в основном это наиболее распространенные задачи для представителей службы поддержки клиентов во многих магазинах.

 4
Author: TiEul, 2016-08-26 12:49:20

Если бы мне пришлось сделать предположение, я бы сказал, что это потому, что секретный ключ может использоваться как часть защиты CSRF и/или XSS, встроенной в Magento. Поэтому для страниц, которые не изменяют свое содержимое на основе пользовательского ввода, может не потребоваться наличие секретного ключа.

Другими словами, только действия, которые получают предоставленные пользователем данные/ввод, защищены секретным ключом. Просто предположение.

 0
Author: Brett, 2016-08-25 21:01:33