Was braucht ein PHP-Entwickler über https / Secure Socket Layer-Verbindungen wissen?

StackOverflow https://stackoverflow.com/questions/64631

  •  09-06-2019
  •  | 
  •  

Frage

Ich weiß so gut wie nichts, wenn es um das Wie kommt und von https-Verbindungen, warum. Natürlich, wenn ich sichere Daten wie Passwörter bin übertragen oder insbesondere Kreditkarteninformationen, https ist ein wichtiges Werkzeug. Was muss ich es wissen, wenn? Was sind die häufigsten Fehler, die Sie Entwickler sehen machen, wenn sie es in ihren Projekten umsetzen? Gibt es Zeiten, in denen https nur eine schlechte Idee ist? Dank!

War es hilfreich?

Lösung

Ein HTTPS oder Secure Sockets Layer (SSL) Zertifikat für eine Website serviert, und in der Regel von einer Zertifizierungsstelle (CA), die effektiv unterzeichnet wird, ist eine vertrauenswürdige dritte Partei, die einige grundlegenden Informationen über Ihre Website überprüft und bescheinigt es für die Verwendung in Browsern. Falls Ihr Browser die CA vertraut, dann vertraut er alle von dieser CA signierte Zertifikate (dies wird als Vertrauenskette bekannt).

Jeder HTTP (oder HTTPS) Anforderung besteht aus zwei Teilen: eine Anforderung und eine Antwort. Wenn Sie etwas über HTTPS-Anforderung, es gibt tatsächlich ein paar Dinge im Hintergrund passiert:

  • Der Client (Browser) hat einen „Handshake“, wo es dem Server des öffentlichen Schlüssels und Identifizierung anfordert.
    • An diesem Punkt kann der Browser auf ihre Gültigkeit überprüfen (ist der Name der Website überein? Ist der Datumsbereich Strom? Es von einer CA er vertraut unterzeichnet ist?). Es kann sogar die CA kontaktieren und sicherstellen, dass das Zertifikat gültig ist.
  • Der Client erstellt ein neues Geheimnis Pre-Master, der verschlüsselt wird die öffentliche Schlüssel-Servern unter Verwendung von (so dass nur der Server kann es entschlüsseln) und an den Server
  • gesendet
  • Der Server und Client verwenden beide diese Pre-Master-Geheimnis das Master-Geheimnis zu erzeugen, die dann verwendet wird, einen symmetrischen Sitzungsschlüssel für die eigentliche Datenaustausch
  • erstellen
  • senden Beide Seiten eine Nachricht, dass sie den Handshake fertig sind
  • Der Server verarbeitet die Anforderung dann normal, und dann verschlüsselt die Antwort der Sitzungsschlüssel mit

Wenn die Verbindung offen gehalten wird, wird der gleiche symmetrische Schlüssel für jede verwendet werden.

Wenn eine neue Verbindung hergestellt ist, und beide Seiten haben immer noch das Master-Geheimnis, neuer Sitzungsschlüssel kann in einem ‚abgekürzten Handshake‘ erzeugt werden. Normalerweise speichert ein Browser einen geheimen Master, bis es geschlossen, während ein Server es für ein paar Minuten oder mehrere Stunden gespeichert werden (je nach Konfiguration).

Weitere Informationen über die Länge der Sitzungen finden Sie unter Wie lange dauert eine HTTPS-symmetrischen Schlüssel letzte?

Zertifikate und Host-Name

Zertifikate sind ein Common Name (CN) zugeordnet, die für HTTPS ist der Domainname. Der CN hat exakt übereinstimmen, beispielsweise ein Zertifikat mit einem CN von „example.com“ wird die Domain nicht überein „www.example.com“, und die Benutzer eine Warnung im Browser erhalten.

Vor SNI , ist es nicht möglich war, mehrere Domain-Namen auf eine IP-Host. Da das Zertifikat abgerufen wird, bevor auch der Client die aktuelle HTTP-Anforderung sendet, und die HTTP-Anforderung enthält die Host: Kopfzeile, die den Server, welche URL sagt zu verwenden, gibt es keine Möglichkeit für den Server zu wissen, was Zertifikat dienen für einen bestimmten Anfrage. SNI fügt den Hostnamen Teil des TLS-Handshake, und so lange, wie es auf Client und Server (und im Jahr 2015, ist es weithin unterstützt) unterstützt werden dann der Server das richtige Zertifikat auswählen kann.

Auch ohne SNI, ein Weg, um mehr Host-Namen zu dienen, ist mit Zertifikaten, die Subject Alternative Names (SANs) umfassen, die das Zertifikat im Wesentlichen zusätzliche Domains sind gültig ist. Google verwendet ein einziges Zertifikat viele seiner Standorte zu sichern, zum Beispiel.

Eine andere Möglichkeit ist Wildcard-Zertifikate zu verwenden. Es ist möglich, ein Zertifikat wie „ .example.com“ in diesem Fall „www.example.com“ und „foo.example.com“ werden beide gültig für dieses Zertifikat zu erhalten. Beachten Sie jedoch, dass "example.com" stimmt nicht überein " .example.com" und auch nicht "foo.bar.example.com". Wenn Sie „www.example.com“ für Ihr Zertifikat verwenden, sollten Sie jemand auf „example.com“ zum Umleiten „www.“ Seite? ˅. Wenn sie fordern https: // Blutzuckerwerle.com , wenn Sie es auf einem separaten IP-Host und zwei Zertifikate haben, die ein Zertifikat Fehler.

Natürlich können Sie sowohl Wildcard und SANs (solange Ihre CA können Sie dies tun) mischen und erhalten ein Zertifikat für beide „example.com“ und mit SANs „ .example.com“, „Beispiel .net“und " .example.net", zum Beispiel.

Formulare

Genau genommen, wenn Sie ein Formular einreichen, es spielt keine Rolle, ob die Formularseite selbst nicht verschlüsselt ist, solange die Submit-URL zu einer https geht: // URL. In Wirklichkeit wurden Nutzer (zumindest theoretisch) nicht ausgebildet Seiten einreichen, wenn sie nicht das kleine „Schloss-Symbol“ zu sehen, so auch die Form selbst über HTTPS bedient werden soll, dies zu erhalten.

Traffic und Serverauslastung

HTTPS-Datenverkehr ist viel größer als sein äquivalent HTTP-Datenverkehr (durch Verschlüsselung und Zertifikat-Overhead), und es setzt auch eine größere Belastung auf dem Server (Verschlüsseln und Entschlüsseln). Wenn Sie einen stark ausgelasteten Server haben, kann es wünschenswert sein, sehr selektiv zu sein über das, was Inhalt serviert wird HTTPS verwenden.

Best Practices

  • Wenn Sie nicht nur HTTPS für die gesamte Website, sollte es automatisch zu HTTPS umleiten, wie erforderlich. Jedes Mal, wenn ein Benutzer angemeldet ist, sollten sie über HTTPS werden, und wenn Sie Session-Cookies verwenden, sollte das Cookie hat die sichere Flag gesetzt . Dies verhindert, dass das Abfangen des Session-Cookie, der die Popularität von Open (unverschlüsselt) Wi-Fi-Netzwerken gegeben besonders wichtig ist.

  • Jede Ressourcen auf der Seite aus dem gleichen Schema kommen sollte für die Seite verwendet wird. Wenn Sie versuchen, Bilder von http zu holen: //, wenn die Seite mit HTTPS geladen wird, wird der Benutzer Sicherheitswarnungen erhalten. Sie entweder vollständig qualifizierte URLs verwendet werden soll, oder eine weitere einfache Möglichkeit ist absolute URLs zu verwenden, die den Hostnamen nicht enthalten (zB src = „/ images / foo.png“), weil sie für beide arbeiten.

    • Dazu gehören externe Ressourcen (zB Google Analytics)
  • Sie nicht tun POSTs (Formular abschickt), wenn sie von HTTPS zu HTTP zu ändern. Die meisten Browser wird moniert dies als Sicherheitswarnung.

Andere Tipps

Ich werde gehen in der Regel nicht in der Tiefe auf SSL, gregmac eine gute Arbeit auf das tat, siehe unten; -).

Doch einige der häufigsten (und kritische) Fehler gemacht (nicht speziell PHP) in Bezug auf die Verwendung von SSL / TLS:

  1. HTTP zulassen, wenn Sie sollten die Durchsetzung HTTPS
  2. Suchen einige Ressourcen über HTTP von einer HTTPS-Seite (zum Beispiel Bilder, IFRAMEs, etc.)
  3. Führung auf HTTP-Seite von HTTPS-Seite unbeabsichtigt - beachten Sie, dass diese „falsche“ Seiten wie „about: blank“ enthält (Ich habe dies als IFRAME Platzhalter verwendet gesehen), wird dies unnötig und unangenehm Popup eines Warnung.

  4. Webserver konfiguriert alt, unsichere Versionen von SSL zu unterstützen (zum Beispiel SSL v2 ist weit verbreitet, doch schrecklich gebrochen) (Okay, das ist nicht genau das Problem des Programmierers, aber manchmal niemand sonst damit umgehen ...)

  5. Webserver konfiguriert unsecure Chiffriersätze zu unterstützen (ich habe in Gebrauch nur NULL Chiffren gesehen, die im Grunde absolut keine Verschlüsselung zur Verfügung stellt) (Dito)

  6. Selbst signierte Zertifikate - verhindert, dass Benutzer der Website Überprüfung der Identität

  7. .
  8. Anforderung der Anmeldeinformationen des Benutzers von einer HTTP-Seite, auch wenn auf eine HTTPS-Seite einreichen. Auch dies die Identität des Servers von Validierung, bevor er sein Passwort zu geben ... Selbst ein Benutzer verhindert, wenn das Passwort verschlüsselt übertragen wird, hat der Benutzer keine Möglichkeit zu wissen, ob er auf eine gefälschte Website ist - oder auch wenn es verschlüsselt wird <. / p>

  9. Nicht sichere Cookie - sicherheitsrelevanten Cookies (wie sessionId, Authentifizierungs-Token, Zugriffstoken, etc.) muss mit dem "sicheren" Attribute gesetzt werden. Das ist wichtig! Wenn es nicht gesetzt ist, um zu sichern, um die Sicherheit Cookie, z.B. SessionId kann über HTTP übertragen werden (!) - und Angreifer sicherstellen kann dies geschehen wird - und damit Session Hijacking ermöglicht etc. Während Sie gerade dabei sind (tho dies ist nicht direkt im Zusammenhang), stellen Sie die Httponly auf Ihre Cookies Attribut auch (hilft einige XSS mildern).

  10. Übermäßig permissive Zertifikate - sagen Sie mehrere Sub-Domains haben, aber nicht alle von ihnen auf der gleichen Vertrauensebene sind. Zum Beispiel haben Sie www.yourdomain.com, dowload.yourdomain.com und publicaccess.yourdomain.com. So könnte man darüber nachdenken, mit einem Wildcard-Zertifikat geht .... aber auch secure.yourdomain.com hat oder finance.yourdomain.com - auch auf einem anderen Server. publicaccess.yourdomain.com wird dann in der Lage sein secure.yourdomain.com zum Imitieren .... Zwar gibt es Fälle geben kann, in denen dies in Ordnung ist, in der Regel würden Sie eine Trennung von Privilegien wollen ...

Das ist alles, was ich jetzt denken kann, könnte erneut bearbeiten sie später ...

Was, wenn es eine schlechte Idee ist, SSL / TLS verwenden - wenn Sie öffentliche Informationen haben, die nicht für eine bestimmte Zielgruppe (entweder einen einzelnen Benutzer oder registrierte Mitglieder) bestimmt ist, und Sie sind nicht besonders über sie Abrufen es speziell aus der richtigen Quelle (zB Börsenticker Werte von einer authentifizierten Quelle muss kommen ...) - dann gibt es keinen wirklichen Grund, den Aufwand (und nicht nur die Leistung ... dev / test / cert / etc) entstehen <. / p>

Wenn Sie jedoch gemeinsam genutzte Ressourcen haben (z denselben Server) zwischen Ihrer Website und anderer empfindlicheren Website, dann sollte die empfindlicheren Stelle die Regeln hier Einstellung sein.

Auch Passwörter (und andere Anmeldeinformationen), Info über Kreditkarten usw. IMMER über SSL / TLS sein sollten.

Seien Sie sicher, dass, wenn sie auf einer HTTPS-Seite, alle Elemente auf der Seite von einer HTTPS-Adresse. Dies bedeutet, dass Elemente, dass das Protokoll übernommen wird, oder dass Sie das Protokoll finden, tun müssen, um auf jeder Seite einen Scheck haben sollten, und verwenden Sie so relative Pfade (zB „/images/banner.jpg“), die für alle Elemente.

Bitte beachten Sie, sind alle externen Ressourcen (wie Google Analytics JavaScript-Dateien)

Das einzig Negative ich denken kann, ist, dass es (fast vernachlässigbar) Bearbeitungszeit für den Browser und dem Server erstellt. Ich würde vorschlagen, nur die Übertragungen zu verschlüsseln, die sein müssen.

Ich würde sagen, die häufigsten Fehler, wenn sie mit einem SSL-fähigen Website arbeiten, sind

  1. Die Website fälschlicherweise leitet Benutzer auf http von einer Seite als https
  2. Die Website schaltet nicht automatisch auf https, wenn es notwendig ist
  3. Bilder und andere Assets auf einer https-Seite werden Läden über HTTP, die eine Sicherheitswarnung vom Browser auslösen. Stellen Sie sicher, dass alle Vermögenswerte werden vollständig qualifizierten URIs, die https angeben.
  4. Das Sicherheitszertifikat funktioniert nur für eine Sub-Domain (zB www), aber Ihre Website tatsächlich nutzt mehr Sub-Domains. Stellen Sie sicher, ein Wildcard-Zertifikat zu erhalten, wenn Sie es brauchen.

würde ich jederzeit vorschlagen jeder Benutzerdaten werden in einer Datenbank gespeichert und kommuniziert, https verwenden. Betrachten Sie diese Anforderung auch wenn die Benutzerdaten banal sind, denn auch viele dieser banalen Details von diesem Benutzer verwendet werden, um sich auf anderen Websites zu identifizieren. Betrachten Sie alle zufälligen Sicherheitsfragen Ihre Bank fragt Sie (wie in welcher Straße leben Sie?). Dies kann von Adressfeldern wirklich leicht genommen werden. In diesem Fall sind die Daten nicht, was Sie ein Passwort betrachten, aber es könnte genauso gut sein. Darüber hinaus können Sie nie vorhersehen, welche Daten Benutzer für eine Sicherheitsfrage an anderer Stelle verwendet werden. Sie können auch mit der Intelligenz der durchschnittlichen Web-Benutzer (man denke an deiner Großmutter), dass die Leckerbissen der Informationen bilden könnten Teil dieses Kennwort des Benutzers woanders erwarten, dass.

Ein Zeiger, wenn Sie https verwenden

macht es so, dass, wenn der Benutzer tippt http://www.website-that-needs-https.com/ etc / yadda.php sie werden automatisch weitergeleitet https://www.website-that-needs-https.com/ etc / yadda.php (Persönliches Haustier ärgern)

Allerdings, wenn Sie nur eine einfache HTML-Webseite zu tun, das wird im Wesentlichen eine Einwegübertragung von Informationen vom Server an den Benutzer, keine Sorge darüber.

Alles sehr guter Tipp hier ... aber ich will einfach nur etwas hinzufügen ..
Ive einige Seiten gesehen, dass Sie eine http Login-Seite und nur umleiten Sie https gibt, nachdem Sie Ihren Benutzernamen posten / pass .. Dies bedeutet, dass der Benutzername in Klartext übertragen wird, bevor die https-Verbindung hergestellt wird ..

Kurz gesagt, die Seite, wo Sie von ssl anmelden, anstatt auf eine ssl Seite veröffentlichen.

Ich fand, dass zu einem nicht vorhandenen Stylesheet zu <link> versuchen verursachte auch Sicherheitswarnungen. Wenn ich den richtigen Pfad verwendet, erscheint das Schloss-Symbol.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top