HSTS Preload-Abschnitt zu .htaccess

7

Nachdem ich kürzlich eine Site auf SSL verschoben hatte, wollte ich HSTS für ein eventuelles Preload erzwingen. Die Syntax ist genehmigt und die Chrome-Liste ermöglicht, dass sie in Ordnung ist. Da es sich jedoch überhaupt nicht um einen Codierer handelt, tritt ein kleines Problem auf.

Ich habe:

php_value upload_tmp_dir "/tmp"

# Force SSL

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

# Redirect to www
RewriteCond %{HTTP_HOST} ^example.com\.com [NC]
RewriteRule (.*) https://www.example.com/$1 [E=HTTPS,R=301,L]

# Security header
Header set Strict-Transport-Security "max-age=63072000; preload; includeSubdomains" env=HTTPS

# End Force SSL'

Dies scheint in Ordnung zu sein, aber einige Websites im Web - ich werde dies nicht mit Zitaten überladen - raten RewriteCond %{HTTPS} offund andere habenRewriteCond %{HTTPS} on

Logischerweise scheint ON richtig zu sein, aber ich muss wissen, was richtig ist. Weder geben Fehler.

Claverhouse
quelle

Antworten:

3

... beraten RewriteCond %{HTTPS} offund andere habenRewriteCond %{HTTPS} on

Das wäre in dem gegebenen Kontext nicht sinnvoll, da dies offensichtlich Gegensätze sind (es würde mich interessieren, die vollständigen Beispiele zu sehen, aus denen Sie dies zitieren).

Aber vielleicht meinst du offvs !on? Diese sind in diesem Zusammenhang gleichwertig. Das !Präfix negiert den regulären Ausdruck, was effektiv bedeutet, dass es nicht "Ein" ist (dh es muss "Aus" sein).

Im Kontext Ihrer obigen Anweisungen, in denen Sie testen, ob HTTPS nicht aktiv ist, sind die folgenden Elemente gleichwertig:

# Does the HTTPS server variable contain "off"?
RewriteCond %{HTTPS} off

# Does the HTTPS server variable not contain "on"?
RewriteCond %{HTTPS} !on

Die HTTPS-Servervariable ist entweder auf "Ein" oder "Aus" gesetzt. (Oder es ist überhaupt nicht eingestellt - aber das hängt von Ihrem Server- / SSL-Setup ab, und das haben Sie bereits entdeckt.)

Was Sie verwenden, ist wirklich nur eine Frage der Präferenz.


Weitere Hinweise zu HSTS und .htaccess

# Redirect to www
RewriteCond %{HTTP_HOST} ^example.com\.com [NC]
RewriteRule (.*) https://www.example.com/$1 [E=HTTPS,R=301,L]

# Security header
Header set Strict-Transport-Security "max-age=63072000; preload; includeSubdomains" env=HTTPS

(Ich nehme an, das Extra .comin ^example.com\.comist nur ein Tippfehler? Das sollte gerecht sein ^example\.com.)

E=HTTPS- Die Einstellung der Umgebungsvariablen HTTPS für die RewriteRule Umleitung scheint erforderlich zu sein, um den Strict-Transport-SecurityHTTP-Antwortheader für die kanonische (nur HTTPS) Nicht-WWW-zu-WWW-Umleitung [* 1] (dh https://example.combis https://www.example.com) festzulegen , die bedingt festgelegt wird basierend auf der env=HTTPSÜberprüfung der HeaderRichtlinie. Damit dieser Header in der Umleitung festgelegt wird , müssen Sie jedoch auch das alwaysSchlüsselwort in der HeaderDirektive verwenden, z. B.:

Header always set Strict-Transport-Security "max-age=63072000; preload; includeSubdomains" env=HTTPS

Wie in den Apache-Dokumenten erwähnt , in Bezug auf die Verwendung alwaysder HeaderDirektive beim Festlegen von Headern für Weiterleitungen :

  • Sie fügen einer lokal generierten nicht erfolgreichen (nicht 2xx) Antwort einen Header hinzu, z. B. einer Umleitung. In diesem Fall alwayswird in der endgültigen Antwort nur die entsprechende Tabelle verwendet.

[* 1] Dieser Header muss in der Umleitung gesetzt werden, um Punkt 4.1 der Anforderungen für die Übermittlung der HSTS-Vorlast zu erfüllen :

Wenn Sie eine zusätzliche Umleitung von Ihrer HTTPS-Site bereitstellen, muss diese Umleitung weiterhin den HSTS-Header enthalten (und nicht die Seite, auf die sie umgeleitet wird).


Nur ein zusätzlicher Kommentar zu dem verlinkten Artikel in den Kommentaren unten, der besagt:

Die env=HTTPSUmgebungsvariable funktionierte nicht wie erwartet. Also habe ich das E=HTTPSFlag in der WWW-Umleitung verwendet, um die env=HTTPSUmgebungsvariable bei der nächsten Anforderung festzulegen .

Das letzte Bit zum Setzen von " env=HTTPSUmgebungsvariable bei der nächsten Anforderung" ist nicht ganz richtig. Es setzt die HTTPSUmgebungsvariable auf die aktuelle (Umleitungs-) Antwort . Zu dem Zeitpunkt, an dem die "nächste Anforderung" erfolgt (dh der Browser hat auf die Umleitung geantwortet), ist diese Umgebungsvariable (die oben festgelegt wurde) längst vergessen. Dies erfordert jedoch, dass das alwaysSchlüsselwort in der HeaderDirektive verwendet wird (wie oben erwähnt).


Header always set Strict-Transport-Security "max-age=63072000; preload; includeSubdomains" env=HTTPS

Nur ein kleiner Punkt, und vielleicht spielt das eigentlich keine Rolle, aber ... ich würde die preloadRichtlinie am Ende der Liste der Richtlinien einfügen. Zum Beispiel:

 Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload" env=HTTPS

Die preloadRichtlinie ist nicht Teil der HSTS- Spezifikation (HTTP Strict Transport Security) . Es wird nur von der Preload-Liste benötigt. Andere Benutzeragenten / Browser verwenden dies nicht und verstehen dies möglicherweise nicht einmal. Daher wäre es logischer, dies am Ende der Liste zu platzieren. Einige Parses werden möglicherweise beendet, sobald sie eine "ungültige" Direktive erreichen.

Herr weiß
quelle
Vielen Dank. Sie sind richtig aus vs! Ein. OFF = hostinger.com/tutorials/ssl/forcing-https ON = stackoverflow.com/questions/33268353/…
Claverhouse
Wenn Sie die Eingabetaste drücken, wird der Kommentar nur geschlossen.
Claverhouse
1
E = HTTPS kam von hier, soweit ich mich erinnere --- Ich habe mir viele langweilige Beispiele angesehen! --- forums.cpanel.net/threads/htaccess-header-set-doesnt-set.613111
Claverhouse
@ Claverhouse Danke für die Links. Im Übrigen !=onist effektiv das gleiche wie !onin diesem Zusammenhang (das Ergebnis ist hier das gleiche). Es gibt jedoch einen Unterschied. Das =Präfix ist es ein exakter String - Vergleich, während ohne =, es ist ein Regex und so überprüft „auf“ überall in der Teststring . Es kann immer nur "Ein" oder "Aus" sein, daher ist das Ergebnis das gleiche. Sehr interessant über die Verwendung von E=HTTPSon the redirect - mein erster Kommentar dazu war falsch. Sie müssen jedoch das alwaysSchlüsselwort zur HeaderDirektive hinzufügen , damit dies funktioniert. Ich habe meine Antwort aktualisiert.
MrWhite
Wenn dies Ihre Frage beantwortet hat, markieren Sie sie bitte als akzeptiert (Häkchen links unter den Abstimmungspfeilen), um sie aus der unbeantworteten Fragenwarteschlange zu entfernen. Sie können auch Antworten positiv bewerten, die Sie nützlich finden. Vielen Dank, sehr geschätzt :)
MrWhite
0
RewriteCond %{HTTPS} !=on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Überprüfen Sie, ob HTTPS NICHT aktiviert ist

RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Überprüfen Sie, ob HTTPS ausgeschaltet ist

RewriteCond %{SERVER_PORT} !^443$
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

Überprüfen Sie, ob die Verbindung NICHT auf dem sicheren https-Port 443 ausgeführt wird

Aber alle machen dasselbe: Überprüfen Sie, ob kein https vorhanden ist, und leiten Sie zu https um.

<IfModule mod_headers.c>
Header set Strict-Transport-Security "max-age=10886400; includeSubDomains; preload"
</IfModule>

Sie wissen bereits, was es tut.

Evgeniy
quelle
Der <IfModule>Wrapper wird hier nicht benötigt. Wenn Sie sich für die "HSTS-Preload-Liste" entscheiden, sollte der Wrapper entfernt werden, da dieser Header obligatorisch ist . Sie vermissen auch die empfohlene env=HTTPSBedingung.
MrWhite
IfModuleDer Wrapper dient zu Überprüfungszwecken, ob das adressierte Modul bereits installiert ist. In Bezug auf env=HTTPSich bin sicher nicht - es gibt eine Reihe von Beispielen , mit und ohne daran zu arbeiten.
Evgeniy
" IfModuleWrapper dient zu Überprüfungszwecken ..." - Ja, aber das ist das Problem. Wenn mod_headers nicht installiert ist, schlägt die Direktive einfach stillschweigend fehl und der Header wird nicht gesetzt. Dieser Header muss gesetzt sein, damit HSTS erfolgreich ist. Dies sollte unterbrochen werden , wenn mod_headers nicht verfügbar ist, da dieser Header nicht optional ist. Sehen Sie diese Frage im Zusammenhang mit Bezug auf mod_rewrite (gleiche Idee): webmasters.stackexchange.com/questions/112600/...
MrWhite
Danke euch beiden. Das Forum enthält jetzt Ihre Vorschläge. Übrigens (ich bitte nicht um weiteren Rat) muss bei WordPress der ausgezeichnete Hackrepair-Bereich zuerst auf .htaccess gehen. hackrepair.com/articles/website-security/… Nur zu beachten, das Preload-Ding scheint das nicht zu mögen!
Claverhouse
Oben als Kommentar hinzugefügt und nicht wie zuvor verlegt. Übrigens, um zu antworten, habe ich die Hackreparatur in gelassen und mache mir nicht die Mühe, das WordPress vorzuladen ...
Claverhouse