Використання захищених URL-адрес на основі контексту


9

Мені знайоме використання різних методів для створення захищеної URL-адреси на основі контексту, тобто:

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

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

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

З того, що я можу сказати, мої єдині реальні варіанти:

  1. Змініть кожен екземпляр, $this->getUrl()щоб він був подібний до фрагменту, наведеного вище.
  2. Встановіть захист base_urlHTTPS, що не захищено , змушуючи захищати всі сторінки.

Чи є кращий метод, який не передбачає необхідності змінювати кожен виклик $this->getUrl()або примушувати всі сторінки до HTTPS незалежно від контексту користувача?

- редагувати -

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

Відповіді:


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-адреси.


Я вважаю за краще просто змінити модель основної URL-адреси, а не включати додаткові безпечні маршрути для кожного можливого маршруту переходу (особливо "невидимі" маршрути, такі як пошук у каталозі / ajax / пропозиція тощо). Так, це суттєва зміна, але це додаткові три рядки коду порівняно з тим, скільки потрібно, щоб покрити всі маршрути фронтену. У ситуації, коли ви хочете змінити лише декілька маршрутів, ваша пропозиція має набагато більше сенсу.
pspahn

Раніше ми модифікували, Mage_Core_Model_Store::getBaseUrlщоб наш магазин завжди був захищеним, коли він вбудований у вкладку Facebook. Однак слід врахувати й інші речі, наприклад, кеш-пам'ять блоку, яка зберігає той, хто потрапив спочатку (вам доведеться додати щось до ключа кешу). Ви також матимете, як каже Девід, незахищені посилання для входу / оформлення замовлення, або в кінцевому підсумку кожен клієнт на вашому веб-сайті добре закінчиться в безпечному режимі, якщо він коли-небудь увійде в систему або потрапить на замовлення.
Пітер О'Каллаган

1
@pspahn Чи вважали ви, що встановлення /catalogsearch/шляху як безпечного повинно містити що-небудь відповідне /catalogsearch/*/*/? Тобто знадобиться лише одне правило, щоб зробити все під catalogsearchзахистом.
davidalger

@Cags вказував на те, що я пропустив, включаючи у свою відповідь, і це примітка про ключі кешу… якщо URL-адреси не однакові та інші, у вас будуть кешовані блоки, які псують отримані посилання.
davidalger

Це хороший момент щодо кеш-ключів. Здається, найкращим способом було б просто запустити все 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.


Ще краще: не використовуйте config.xml, а local.xml
Майкл

1

Є занижений, але важливий варіант у Системі | Конфігурація | Веб ~, де ви повинні сказати "використовувати захищений URL в інтерфейсі" - якщо встановити це так, то сторінка, завантажена https, використовуватиме https-посилання,

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.