Verwenden sicherer URLs basierend auf dem Kontext

9

Ich bin mit der Verwendung verschiedener Methoden zum Generieren einer sicheren URL basierend auf dem Kontext vertraut, dh:

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

Dies eignet sich hervorragend zum Erstellen von Links, die im sicheren Modus auf eine sichere Seite verweisen (oder nur auf die nicht sichere Seite verlinken, wenn der sichere Modus nicht verwendet wird).

Das Problem, das ich betrachte, ist, dass Magento nur einige spezielle Seiten als sicher behandelt (Kundenkonto, Kasse usw.). Ich würde es vorziehen, wenn Magento immer einen sicheren Link verwendet, wenn sich der Benutzer derzeit im sicheren Modus befindet , oder den nicht sicheren Link verwenden würde, wenn sich der Benutzer im nicht sicheren Modus befindet.

Nach allem, was ich sagen kann, sind meine einzigen wirklichen Optionen:

  1. Ändern Sie jede Instanz von so $this->getUrl(), dass sie dem obigen Snippet ähnelt.
  2. Stellen Sie nicht sicher ein base_url, um HTTPS zu verwenden, und zwingen Sie alle Seiten zur Sicherung.

Gibt es eine bessere Methode, bei der nicht jeder Aufruf $this->getUrl()von HTTPS geändert oder alle Seiten gezwungen werden müssen, unabhängig vom Benutzerkontext?

- bearbeiten -

Ich bin mir bewusst, dass ich die /app/code/core/Mage/Core/Model/Url.php->setRouteParams()Methode ändern kann, obwohl ich hoffe, dass es einen saubereren Weg gibt.

pspahn
quelle

Antworten:

5

Wenn Magento immer mit dem Protokoll übereinstimmt, auf dem sich der Benutzer gerade befindet, kann dies zu Problemen führen, z. B. wenn auf einer nicht gesicherten URL wie der Startseite der Website keine sicheren URLs an die Kundenanmeldeseite ausgegeben werden.

Ich würde vorschlagen, der Konfigurationsdatei eines benutzerdefinierten Moduls Konfigurations-XML hinzuzufügen, um die zusätzlichen Routen, die Sie benötigen, als sicher zu deklarieren. Sie tun dies, indem Sie dies in Ihrer config.xml-Datei haben (durch module_or_route_idetwas Einzigartiges ersetzen :

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

Wenn Sie einen Blick auf die Datei config.xml für das Modul Mage_Customer werfen, sehen Sie ein Beispiel dafür, in dem der Pfad "/ customer /" als sicher definiert wurde.

Hinweis: Wenn der module_or_route_idTeil des obigen Beispiels nicht eindeutig ist, wird nur eine Definition verwendet, was dazu führt, dass etwas nicht ordnungsgemäß gesichert wird. Stellen Sie sicher, dass der Knotenname eindeutig ist. :) :)

Da dies jedoch pfadbasiert ist, bin ich mir nicht sicher, wie dies beispielsweise direkt auf URLs einzelner CMS-Inhaltsseiten zutreffen würde, da alle weiterhin eine Route / einen Pfad gemeinsam nutzen, da sie alle neu an dasselbe CMS gesendet werden Regler.

Wenn Sie dann wirklich die gesamte Site benötigen, um HTTPS auszuführen, müssen Sie https: // URLs für sichere und nicht sichere Basis-URL-Einstellungen verwenden.

Davidalger
quelle
Ich würde es vorziehen, nur das Kern-URL-Modell zu ändern, anstatt zusätzliche sichere Routen für jede mögliche Frontend-Route einzuschließen (insbesondere die "nicht sichtbaren" Routen wie Katalogsuche / Ajax / Suggest usw.). Ja, es ist eine grundlegende Änderung, aber es sind zusätzliche drei Codezeilen im Vergleich zu den vielen, die erforderlich wären, um alle Frontend-Routen abzudecken. In einer Situation, in der es nur ein paar Routen sind, die Sie ändern möchten, ist Ihr Vorschlag viel sinnvoller.
pspahn
In der Vergangenheit haben wir Änderungen vorgenommen Mage_Core_Model_Store::getBaseUrl, um unseren Shop immer sicher zu machen, wenn er in einen Facebook-Tab eingebettet ist. Es gibt jedoch noch andere Dinge zu beachten, z. B. das Speichern des Block-Cache, je nachdem, welcher Treffer zuerst eintritt (Sie müssen dem Cache-Schlüssel etwas hinzufügen). Sie haben auch entweder, wie David sagt, nicht sichere Links zum Anmelden / Auschecken, oder letztendlich befindet sich jeder Kunde auf Ihrer Website im sicheren Modus, wenn er sich jemals anmeldet oder an die Kasse geht.
Peter O'Callaghan
1
@pspahn Haben Sie gedacht, dass das Festlegen des /catalogsearch/Pfads als sicher etwas Passendes beinhalten sollte /catalogsearch/*/*/? Dh es würde nur eine Regel erfordern, um alles unter catalogsearchsicher zu machen .
Davidalger
@Cags hat auf etwas hingewiesen, das ich in meiner Antwort verpasst habe, und das ist der Hinweis zu Cache-Schlüsseln. Wenn die URLs nicht konsistent sind, haben Sie zwischengespeicherte Blöcke, die die resultierenden Links durcheinander bringen.
Davidalger
Das ist ein guter Punkt bei Cache-Schlüsseln. Der beste Weg zu sein scheint, einfach alles HTTPS auszuführen.
pspahn
2

Stellen Sie Folgendes in Ihre app/etc/config.xmlDatei ein:

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

Dies funktioniert in Magento 1.9.1

Wenn der Benutzer https verwendet, sollte dies alle URLs zwingen, in https umzuschreiben.

Artistan
quelle
Noch besser: Verwenden Sie nicht config.xml, sondern local.xml
Michael
1

Es gibt eine untertriebene, aber wichtige Option in System | Konfiguration | Web ~ wo Sie sagen müssen "sichere URL im Frontend verwenden" - wenn Sie dies auf "Ja" setzen, verwendet eine von https geladene Seite https-Links.

In den meisten Fällen muss kein Code geschrieben oder zusätzliche Konfiguration bereitgestellt werden

tanzen
quelle