HTTP veya HTTPS'yi algılama ve ardından JavaScript'te HTTPS'yi zorlama


298

HTTP veya HTTPS'yi algılamanın ve ardından HTTPS'nin JavaScript ile kullanımını zorlamanın bir yolu var mı?

HTTP veya HTTPS algılamak için bazı kodları var ama kullanmaya zorlayamıyorum https: .

Site ne olursa olsun ayarlamak için window.location.protocol özelliği kullanıyorum https:sonra tarayıcıya yüklü yeni bir https'ed URL yeniden yüklemek için sayfayı yenilemek için kullanıyorum.

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

15
Bu, sunucu tarafında çok daha güvenilir (ve verimli) bir şekilde ele alınmaktadır.
Quentin

3
Bence haklısın. MITM saldırısı kullanan bir saldırgan olarak, bu kodu silebilirdim. Bu yüzden sadece pasif saldırılara karşı koruma sağlar.
ndevln


1
@NeoDevlin http üzerinde bir MITM saldırganı da sunucu tarafı yönlendirmesinin yerini alabilir
Alex Lehmann

1
Kesinlikle. 2018'de HSTS'yi kullanmamak için bir mazeret yoktur. HTTPS'yi zorlamanın tek güvenli yolu budur.

Yanıtlar:


501

Bunu dene

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

location.href = blahbu yönlendirmeyi tarayıcı geçmişine ekler. Kullanıcı geri düğmesine basarsa, aynı sayfaya yeniden yönlendirilir. location.replaceBu yönlendirmeyi tarayıcı geçmişine eklemediği için kullanmak daha iyidir .


3
Neden windowolmasın document?
webjay


11
Dize karşılaştırması olmalı !==mı?
Wes Turner

5
@WesTurner Her iki şekilde de önemli değil. İkisi de hep ip olacak. Biri bir sayı veya bir boole ise, o zaman fark yaratabilir.
Soumya

15
location.replace(url)bu durumdan çok daha iyi olurdu location.href = url. Bu yönlendirmeyi tarayıcının geçmişinde veya geri düğmesine basan kullanıcının yalnızca yeniden yönlendirilmesini istemezsiniz.
Francisco Zarabozo

59

Location.protocol ayarı yeni bir URL'ye gider . Hiçbir şeyi ayrıştırmaya / dilimlemeye gerek yok.

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

Firefox 49 bir var hatahttps çalışıyor ancak https:değil. Bahsedilen gereken ateş 54 sabit .


2
if window.location.href.match('http:') window.location.href = window.location.href.replace('http', 'https')en son FF ve Chrome'da çalışır.
Martin Stannard

2
location.protocol = "https";firefox 28'de çalışıyor gibi görünüyor
Nick Russler

1
Geri düğmesini kıran bok. location.replaceBunun yerine kullanın .
Warlike Şempanze

22

İyi bir fikir değil çünkü sadece geçici https ve tarayıcıya yönlendirme kullanıcı Bu yönlendirmeyi kaydetmez.

Web sunucusu için görev tanımladınız (apache, nginx vb.) http 301, http 302


3
Katılıyorum. Sunucuda https zorlamak çok daha güvenilir
Hoàng Long

3
Karma değerini korumak önemliyse kullanıldığını görebiliyordum. Sunucuya gönderilmez ve bazı tarayıcılar korumaz.
Jason Rice

İşte sadece https için Azure Web Sitesine bağlantı ... blogs.msdn.com/b/benjaminperkins/archive/2014/01/07/…
OzBob

1
Mutlaka doğru değil. 301'in önbellekleme nedenlerinin şeytan olduğu bir düşünce okulu var. getluky.net/2010/12/14/301-redirects-cannot-be-undon
fivedogit

2
Bu müşteri tarafını yapmanın genellikle iyi bir fikir olmadığı doğru olsa da, bu istenen şey değildir. Ve nasıl yapılacağını göstermiyorsunuz, bu yüzden bu bir cevap değil. Ayrıca, statik web sayfalarının bu günlerinde, genellikle bu sunucu tarafını yapmanın bir yolu yoktur (Github sayfalarını düşünün), yani bunu istemcide yapmanız gerekir. Yine de, kullanıcıların SSL olmayan sürüme çarpmasını önlemek için standart bağlantı etiketleri ekleyerek aramanın iyileştirilmesine yardımcı olabilirsiniz.
oligofren

16

Buna ne dersin?

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

İdeal olarak sunucu tarafında yapardınız.


bağlantı noktasını kaçırıyor
eadmaster

13
if (location.protocol == 'http:')
  location.href = location.href.replace(/^http:/, 'https:')

5

Bunu cevaplamanın bir Javascript yolu değil ancak CloudFlare kullanıyorsanız kullanıcıyı HTTPS'ye daha hızlı yönlendiren sayfa kuralları yazabilirsiniz ve ücretsizdir. CloudFlare Sayfa Kurallarında şöyle görünür:

resim açıklamasını buraya girin


Aslında bunu çok yararlı buldum, soruyu çerçeveli olarak cevaplamak için değil, her zaman açık SSL sunmayan bir SaaS hizmeti için daha güvenilir bir yol hakkında yararlı bilgiler sağlamak için.
MrMesees

3

Yapabilirsin:

  <script type="text/javascript">        
        if (window.location.protocol != "https:") {
           window.location.protocol = "https";
        }
    </script>

İşe yarıyor. Yönlendirmenin standart bir yolu var mı? tüm tarayıcılarda çalışır mı?
mahfuz



0

Bu sorunun cevaplarını seviyorum. Ancak yaratıcı olmak için bir şekilde daha paylaşmak istiyorum:

<script>if (document.URL.substring(0,5) == "http:") {
            window.location.replace('https:' + document.URL.substring(5));
        }
</script>

0

Aşağıdaki kod 'str' değişkeninin http: // .... dizenizi içerdiğini varsayar. Https olup olmadığını ve true değerinin hiçbir şey yapıp yapmadığını kontrol eder. Ancak http ise http'yi https ile değiştirir.

if (str.indexOf('https') === -1) {
  str = str.replace('http', 'https')
}


2
Bu kod soruyu cevaplayabilirken, sorunun nasıl ve / veya neden çözüldüğüne dair ek bağlam sağlamak yanıtlayıcının uzun vadeli değerini artıracaktır.
Donald Duck

-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>

-1

Merhaba ben bu çözüm mükemmel çalışır kullanılır. Kontrol etmek gerek, sadece https kullanın.

<script language="javascript" type="text/javascript">
document.location="https:" + window.location.href.substring(window.location.protocol.length, window.location.href.length);
</script>

3
protokol https olsa bile bu sayfayı yenilemez mi?
Anthony

-2

Ben sadece Pui Cdm tarafından test tüm script varyasyonları var , yukarıdaki cevaplar dahil ve diğerleri php, htaccess, sunucu yapılandırması ve Javascript kullanarak, sonuçları script

<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 tarafından sağlanan en iyi şekilde çalışır ve java komut dosyasında daha fazla güvenlik ekleyebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.