Erkennen Sie HTTP oder HTTPS und erzwingen Sie dann HTTPS in JavaScript

298

Gibt es eine Möglichkeit, HTTP oder HTTPS zu erkennen und dann die Verwendung von HTTPS mit JavaScript zu erzwingen?

Ich habe einige Codes zum Erkennen von HTTP oder HTTPS, kann diese jedoch nicht erzwingen https:.

Ich verwende die Eigenschaft window.location.protocol , um festzulegen , was auch immer die Site ist, und https:dann die Seite zu aktualisieren, um hoffentlich eine neue https-URL neu zu laden, die in den Browser geladen wird.

if (window.location.protocol != "https:") {
   window.location.protocol = "https:";
   window.location.reload();
}
registrierter Nutzer
quelle
15
Dies wird auf der Serverseite weitaus zuverlässiger (und effizienter) gehandhabt.
Quentin
3
Ich glaube, Du hast recht. Als Angreifer, der einen MITM-Angriff verwendet, konnte ich diesen Code einfach löschen. Es bietet also nur Schutz vor passiven Angriffen.
ndevln
1
@NeoDevlin ein MITM-Angreifer auf http kann auch eine serverseitige Weiterleitung ersetzen
Alex Lehmann
1
Genau. Im Jahr 2018 gibt es keine Entschuldigung, HSTS nicht zu verwenden. Dies ist der einzig sichere Weg, um HTTPS zu erzwingen.

Antworten:

500

Versuche dies

if (location.protocol !== 'https:') {
    location.replace(`https:${location.href.substring(location.protocol.length)}`);
}

location.href = blahFügt diese Weiterleitung zum Browserverlauf hinzu. Wenn der Benutzer auf die Schaltfläche "Zurück" klickt, wird er auf dieselbe Seite zurückgeleitet. Es ist besser zu verwenden, location.replaceda diese Umleitung nicht zum Browserverlauf hinzugefügt wird.

Soumya
quelle
3
Warum windowund nicht document?
Webjay
11
Sollte der Stringvergleich sein !==?
Wes Turner
5
@WesTurner Es sollte so oder so keine Rolle spielen. Sie werden beide immer Saiten sein. Wenn man eine Zahl oder ein Boolescher Wert ist, kann dies einen Unterschied machen.
Soumya
15
location.replace(url)wäre viel besser als location.href = urlfür diesen Fall. Sie möchten nicht, dass diese Umleitung im Browserverlauf angezeigt wird oder dass der Benutzer die Zurück-Schaltfläche drückt, um erneut umgeleitet zu werden.
Francisco Zarabozo
59

Durch Festlegen von location.protocol wird zu einer neuen URL navigiert . Sie müssen nichts analysieren / in Scheiben schneiden.

if (location.protocol !== "https:") {
  location.protocol = "https:";
}

49 Firefox hat einen Bug , wo httpsfunktioniert aber https:nicht. Angeblich in Firefox 54 behoben .

Sam
quelle
2
if window.location.href.match('http:') window.location.href = window.location.href.replace('http', 'https')funktioniert mit den neuesten FF und Chrome.
Martin Stannard
2
location.protocol = "https";scheint jedoch in Firefox 28 zu funktionieren
Nick Russler
1
Mist, der den Zurück-Knopf bricht. Verwenden Sie location.replacestattdessen.
Warlike Schimpanse
22

Dies ist keine gute Idee, da Sie den Benutzer nur vorübergehend zu https umleiten und der Browser diese Umleitung nicht speichert.

Sie beschreiben die Aufgabe für den Webserver (Apache, Nginx usw.) http 301, http 302

b1_
quelle
3
zustimmen. Das Erzwingen von https auf dem Server ist weitaus zuverlässiger
Hoàng Long
3
Ich konnte sehen, dass es verwendet wird, wenn es wichtig ist, den Hash-Wert beizubehalten. Es wird nicht an den Server gesendet und wird von einigen Browsern nicht beibehalten.
Jason Rice
Hier ist ein Link zur Set Azure-Website nur für https ... blogs.msdn.com/b/benjaminperkins/archive/2014/01/07/…
OzBob
1
Nicht unbedingt wahr. Es gibt eine Denkschule, dass 301 aus Caching-Gründen der Teufel ist. getluky.net/2010/12/14/301-redirects-cannot-be-undon
fivedogit
2
Es ist zwar richtig, dass es im Allgemeinen keine gute Idee ist, diese Client-Seite zu erstellen, aber dies wurde nicht gefragt. Und Sie zeigen nicht, wie es geht, daher ist dies keine Antwort. In diesen Tagen statischer Webseiten gibt es häufig keine Möglichkeit, diese Serverseite auszuführen (denken Sie an Github-Seiten), was bedeutet, dass Sie dies auf dem Client tun müssen. Sie können die Suche jedoch verbessern, indem Sie kanonische Link-Tags hinzufügen, um zu vermeiden, dass Personen die Nicht-SSL-Version verwenden.
Oligofren
16

Wie wäre es damit?

if (window.location.protocol !== 'https:') {
    window.location = 'https://' + window.location.hostname + window.location.pathname + window.location.hash;
}

Idealerweise tun Sie dies jedoch auf der Serverseite.

Keirog
quelle
Es fehlt der Hafen
eadmaster
13
if (location.protocol == 'http:')
  location.href = location.href.replace(/^http:/, 'https:')
Steven Penny
quelle
5

Keine Javascript-Methode, um dies zu beantworten, aber wenn Sie CloudFlare verwenden, können Sie Seitenregeln schreiben , die den Benutzer viel schneller zu HTTPS umleiten, und es ist kostenlos. Sieht in den Seitenregeln von CloudFlare folgendermaßen aus:

Geben Sie hier die Bildbeschreibung ein

Mikeumus
quelle
Ich fand dies tatsächlich sehr nützlich, nicht um die Frage als gerahmt zu beantworten, sondern um nützliche Informationen über einen möglicherweise zuverlässigeren Weg für einen SaaS-Dienst bereitzustellen, der nicht immer SSL bietet.
MrMesees
3

Du kannst tun:

  <script type="text/javascript">        
        if (window.location.protocol != "https:") {
           window.location.protocol = "https";
        }
    </script>
M.BRAHAM
quelle
Es klappt. Ist es eine Standardmethode zum Umleiten? funktioniert es in allen Browsern?
Mahfuz
1

Funktionsweise

window.location.protocol === 'http:' && (location.href = location.href.replace(/^http:/, 'https:'));
Дмитрий Васильев
quelle
0

Ich mag die Antworten auf diese Frage. Aber um kreativ zu sein, möchte ich noch einen Weg teilen:

<script>if (document.URL.substring(0,5) == "http:") {
            window.location.replace('https:' + document.URL.substring(5));
        }
</script>
Charles Hamel
quelle
-1
<script type="text/javascript">
        function showProtocall() {

            if (window.location.protocol != "https") {
                window.location = "https://" + window.location.href.substring(window.location.protocol.length, window.location.href.length);
                window.location.reload();
            }
        }
        showProtocall();
</script>
Vivek Srivastava
quelle
-1

Hallo, ich habe diese Lösung verwendet, funktioniert perfekt. Keine Notwendigkeit zu überprüfen, verwenden Sie einfach https.

<script language="javascript" type="text/javascript">
document.location="https:" + window.location.href.substring(window.location.protocol.length, window.location.href.length);
</script>
BrAiNee
quelle
3
Wird die Seite dadurch nicht aktualisiert, auch wenn das Protokoll https ist?
Anthony
-2

Ich habe gerade alle Skriptvarianten von Pui Cdm testen lassen , einschließlich der obigen Antworten und vieler anderer, die PHP, Htaccess, Serverkonfiguration und Javascript verwenden. Das Ergebnis ist, dass das Skript

<script type="text/javascript">        
function showProtocall() {
        if (window.location.protocol != "https") {
            window.location = "https://" + window.location.href.substring(window.location.protocol.length, window.location.href.length);
            window.location.reload();
        }
    }
    showProtocall();
</script> 

Die von vivek-srivastava bereitgestellte Funktion funktioniert am besten und Sie können dem Java-Skript weitere Sicherheit hinzufügen.

Peter
quelle