Korzystanie z bezpiecznych adresów URL na podstawie kontekstu

9

Znam różne metody generowania bezpiecznego adresu URL na podstawie kontekstu, tj .:

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

Działa to świetnie do budowania linków prowadzących do bezpiecznej strony, gdy jesteś w trybie bezpiecznym (lub po prostu prowadzi do niezabezpieczonej strony, jeśli nie używasz trybu bezpiecznego).

Problem, na który patrzę, polega na tym, że Magento traktuje tylko kilka specjalnych stron jako wymagające bezpieczeństwa (konto klienta, kasa itp.). Wolałbym, aby Magento zawsze korzystał z bezpiecznego łącza, jeśli użytkownik jest obecnie w trybie bezpiecznym , lub z niezabezpieczonego łącza, jeśli użytkownik jest w trybie niezabezpieczonym.

Z tego, co mogę powiedzieć, moje jedyne prawdziwe opcje to:

  1. Zmodyfikuj każde wystąpienie, $this->getUrl()aby było podobne do powyższego fragmentu.
  2. Ustaw niezabezpieczone base_urlna używanie HTTPS, zmuszając wszystkie strony do zabezpieczenia.

Czy istnieje lepsza metoda, która nie wymaga zmiany każdego wywołania $this->getUrl()lub zmuszania wszystkich stron do HTTPS niezależnie od kontekstu użytkownika?

-- edytować --

Wiem, że mogę zmodyfikować /app/code/core/Mage/Core/Model/Url.php->setRouteParams()metodę, ale mam nadzieję, że istnieje lepszy sposób.

pspahn
źródło

Odpowiedzi:

5

Posiadanie Magento zawsze zgodnego z protokołem, na którym aktualnie znajduje się użytkownik, spowodowałoby problemy, takie jak nie wyrzucanie bezpiecznych adresów URL na stronę logowania klienta w niezabezpieczonym adresie URL, takim jak strona główna witryny.

Sugeruję, aby dodać trochę XML konfiguracji do pliku konfiguracyjnego modułu niestandardowego, aby zadeklarować dodatkowe trasy, które należy zabezpieczyć jako bezpieczne. Robisz to, umieszczając to w pliku config.xml (zamieniając na module_or_route_idcoś unikalnego:

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

Jeśli zajrzysz do pliku config.xml dla modułu Mage_Customer, zobaczysz przykład, w którym ścieżka „/ customer /” została zdefiniowana jako bezpieczna.

Uwaga: jeśli module_or_route_idczęść powyższego przykładu nie jest unikalna, zostanie użyta tylko jedna definicja, co spowoduje, że coś nie będzie odpowiednio zabezpieczone. Upewnij się, że nazwa węzła jest unikalna. :)

Ponieważ jest to oparte na ścieżce, nie jestem pewien, w jaki sposób miałoby to bezpośrednio zastosowanie do adresów URL poszczególnych stron treści CMS, na przykład, ponieważ wszystkie one nadal współużytkują trasę / ścieżkę, ponieważ jest to przepisanie, które wysyła je wszystkie do tego samego CMS kontroler.

Jeśli naprawdę potrzebujesz całej witryny do uruchomienia HTTPS, musisz użyć adresów URL https: // zarówno dla bezpiecznego, jak i niezabezpieczonego podstawowego adresu URL.

davidalger
źródło
Wolałbym po prostu zmodyfikować podstawowy model adresu URL zamiast uwzględniać dodatkowe bezpieczne trasy dla każdej możliwej trasy interfejsu użytkownika (szczególnie „niewidoczne” trasy, takie jak wyszukiwanie katalogu / ajax / sugerować itp.). Tak, to podstawowa zmiana, ale to dodatkowe trzy wiersze kodu w porównaniu z tym, ile zajmie pokrycie wszystkich tras frontendowych. W sytuacji, gdy chcesz zmienić tylko kilka tras, Twoja sugestia ma o wiele większy sens.
pspahn
W przeszłości modyfikowaliśmy, Mage_Core_Model_Store::getBaseUrlaby nasz sklep był zawsze bezpieczny, gdy jest osadzony w zakładce Facebook. Są jednak inne rzeczy do rozważenia, takie jak przechowywanie pamięci podręcznej bloków w zależności od tego, które trafienie jest pierwsze (musisz dodać coś do klucza pamięci podręcznej). Będziesz mieć albo, jak mówi David, niezabezpieczone linki do logowania / realizacji transakcji lub ostatecznie każdy klient Twojej witryny znajdzie się w trybie bezpiecznym, jeśli kiedykolwiek się zaloguje lub przejdzie do kasy.
Peter O'Callaghan
1
@pspahn Czy uważasz, że ustawienie /catalogsearch/ścieżki jako bezpiecznej powinno obejmować coś pasującego /catalogsearch/*/*/? Tzn. Potrzebowałaby tylko jedna zasada, aby wszystko catalogsearchbyło bezpieczne.
davidalger
@Cags zwrócił uwagę na coś, co przeoczyłem, w tym w mojej odpowiedzi, i to jest uwaga na temat kluczy pamięci podręcznej… jeśli adresy URL nie są konsekwentnie jedno lub drugie, będziesz mieć zbuforowane bloki, które psują wynikowe linki.
davidalger
To dobra uwaga na temat kluczy pamięci podręcznej. Wydaje się, że najlepszym sposobem jest uruchomienie wszystkiego HTTPS.
pspahn
2

Ustaw następujące parametry w swoim app/etc/config.xmlpliku:

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

Działa to w Magento 1.9.1

Jeśli użytkownik używa https, powinno to zmusić wszystkie adresy URL do przepisania na https.

Artistan
źródło
Jeszcze lepiej: nie używaj config.xml, ale local.xml
Michael
1

W Systemie jest zaniżona, ale ważna opcja Konfiguracja | Internet ~, w którym musisz powiedzieć „użyj bezpiecznego adresu URL w interfejsie użytkownika” - jeśli wybierzesz opcję tak, strona ładowana przez https będzie używać linków https,

w większości przypadków nie trzeba pisać kodu ani zapewniać dodatkowej konfiguracji

tańczyć
źródło