Использование безопасных URL на основе контекста

9

Я знаком с использованием различных методов для создания безопасного URL на основе контекста, а именно:

$this->getUrl('my-page', array('_forced_secure' => $this->getRequest()->isSecure()));

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

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

Из того, что я могу сказать, мои единственные реальные варианты:

  1. Измените каждый экземпляр так, $this->getUrl()чтобы он был похож на приведенный выше фрагмент.
  2. Установите небезопасный base_urlдля использования HTTPS, заставляя все страницы для защиты.

Есть ли лучший метод, который не требует изменения каждого вызова $this->getUrl()или принудительного вызова всех страниц HTTPS независимо от контекста пользователя?

-- редактировать --

Я знаю, что могу изменить /app/code/core/Mage/Core/Model/Url.php->setRouteParams()метод, хотя я надеюсь, что есть более чистый способ.

pspahn
источник

Ответы:

5

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

То, что я хотел бы предложить сделать, это добавить некоторый конфигурационный XML в файл конфигурации пользовательского модуля, чтобы объявить дополнительные маршруты, которые вы должны быть безопасными, как безопасные. Вы делаете это, имея это в своем файле config.xml (заменив его module_or_route_idчем-то уникальным:

<config>
    <frontend>
        <secure_url>
            <module_or_route_id>/route/</module_or_route_id>
        </secure_url>
    </frontend>
</config>

Если вы посмотрите на файл config.xml для модуля Mage_Customer, вы увидите пример этого, где путь "/ customer /" был определен как безопасный.

Примечание: если module_or_route_idчасть приведенного выше примера не является уникальным, будет использоваться только одно определение, ведущий так что - то не правильно закреплен. Убедитесь, что имя узла уникально. :)

Поскольку это основано на пути, я не уверен, как это будет напрямую применяться к URL-адресам отдельных страниц контента CMS, например, так как они все еще будут совместно использовать маршрут / путь, так как это перезапись, которая отправляет их в одну и ту же CMS. контроллер.

Если вам действительно нужен весь сайт для запуска HTTPS, то вам придется использовать https: // URL-адреса как для защищенных, так и для небезопасных настроек базовых URL-адресов.

davidalger
источник
Я бы предпочел просто изменить базовую модель URL, а не включать дополнительные безопасные маршруты для каждого возможного маршрута веб-интерфейса (особенно «невидимых» маршрутов, таких как catalogsearch / ajax / offer и т. Д.). Да, это основное изменение, но это дополнительные три строки кода и столько, сколько потребуется, чтобы охватить все маршруты веб-интерфейса. В ситуации, когда вам нужно изменить только пару маршрутов, ваше предложение имеет гораздо больший смысл.
pspahn
В прошлом мы Mage_Core_Model_Store::getBaseUrlвносили изменения, чтобы сделать наш магазин всегда безопасным, когда он встроен во вкладку Facebook. Однако следует учитывать и другие вещи, такие как хранение кеша блоков в зависимости от того, что ударил первым (вам нужно будет что-то добавить в ключ кеша). У вас также будут либо, как говорит Дэвид, небезопасные ссылки для входа в систему / оформления заказа, либо, в конечном счете, все клиенты вашего сайта окажутся в безопасном режиме, если они когда-либо войдут в систему или перейдут на проверку.
Питер О'Каллаган
1
@pspahn Считаете ли вы, что установка /catalogsearch/безопасного пути должна включать в себя что-либо соответствующее /catalogsearch/*/*/? Т.е. потребуется всего одно правило, чтобы все catalogsearchбыло в безопасности.
Давидгер
@Cags указал на то, что я пропустил, в том числе и в своем ответе, и это примечание о ключах кеша… если URL-адреса не совпадают одно или другое, у вас будут кешированные блоки, портящие получающиеся ссылки.
Давидгер
Это хороший момент о ключах кеша. Похоже, лучший способ - просто запустить все HTTPS.
pspahn
2

Установите следующее в вашем app/etc/config.xmlфайле:

<?xml version="1.0"?>
<config>
  <frontend>
    <secure_url>
      <all>/</all>
    </secure_url>
  </frontend>
</config>

Это работает в Magento 1.9.1

Если пользователь использует https, все URL должны быть переписаны на https.

Artistan
источник
Еще лучше: не используйте config.xml, но local.xml
Майкл
1

Есть заниженная, но важная опция в Системе | Конфигурация | Web ~, где вы должны сказать «использовать безопасный URL-адрес во внешнем интерфейсе» - если вы установите для этого значение «да», то страница, загруженная https, будет использовать ссылки https

нет необходимости писать код или предоставлять дополнительную конфигурацию в большинстве случаев

dancl
источник