it-swarm-tr.com

Kullanıcıları sayfamı HTTP yerine HTTPS üzerinden erişmeye nasıl zorlayabilirim?

HTTPS sayfası olarak erişmeye zorlamak istediğim tek bir sayfa var (Apache'de PHP). HTTPS gerektiren tüm dizini yapmadan bunu nasıl yapabilirim? Veya bir HTTP sayfasından bir HTTPS sayfasına form gönderirseniz, bunu HTTP yerine HTTPS ile gönderir mi?

İşte benim örnek:

http://www.example.com/some-page.php

Sadece erişilebilmesini istiyorum:

https://www.example.com/some-page.php

Tabii, bu sayfanın tüm linklerini HTTPS versiyonunda gösterebilirim, ancak bazı aptalların bilerek HTTP üzerinden erişmelerini engellemiyor ...

Düşündüğüm bir şey, HTTPS sürümüne eriştiklerinden emin olmak için PHP dosyasının başlığına bir yönlendirme koymaktı:

if($_SERVER["SCRIPT_URI"] == "http://www.example.com/some-page.php"){
  header('Location: https://www.example.com/some-page.php');
}

Ama bu doğru yol olamaz, değil mi?

BTW, lütfen URL’ye dikkat etmeyin. Aslında bir alışveriş sepeti vb. Olan bir sayfa olsaydı, bunu farklı bir şekilde yapabileceğini biliyorum. Kartınızı bir defalık ödeme amacıyla, harici bir sitedeki ödeme ağ geçidine gönderilmek üzere kredi kartı bilgilerinizi girdiğiniz bir fiyat karşılığında tek bir ürün satan bir siteden bir sayfa olarak düşünün.

123
Wiki

Daha önce yaptığım yol temelde yazdıklarınız gibidir, ancak kodlanmış herhangi bir değeri yoktur:

if ($ _ SERVER ["HTTPS"]! = "on") 
 {
 header ("Konum: https: //". $ _SERVER ["HTTP_Host"]. $ _SERVER ["REQUEST_URI"]); 
 çıkış();
}
163
Adam Rosenfield

Bunu Apache'de bir yönerge ve mod_rewrite ile yapabilirsiniz:

<Location /buyCrap.php>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI}
</Location>

İsterseniz Konumu, normal ifadeleri kullanarak daha akıllı hale getirebilirsiniz. 

45
thebigjc

Client 'ı her zaman HTTP Strict Transport Security (HSTS) başlıklı HTTPS istemek için zorlamalısınız:

// Use HTTP Strict Transport Security to force client to use secure connections only
$use_sts = true;

// iis sets HTTPS to 'off' for non-SSL requests
if ($use_sts && isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') {
    header('Strict-Transport-Security: max-age=31536000');
} elseif ($use_sts) {
    header('Location: https://'.$_SERVER['HTTP_Host'].$_SERVER['REQUEST_URI'], true, 301);
    // we are in cleartext at the moment, prevent further execution and output
    die();
}

HSTS'nin çoğu modern tarayıcıda desteklendiğini ancak evrensel olmadığını lütfen unutmayın. Bu nedenle yukarıdaki mantık, HTTP'de sona erme durumunda desteği ne olursa olsun kullanıcıyı manuel olarak yönlendirir ve ardından HSTS başlığını ayarlar, böylece daha fazla müşteri talebi tarayıcı tarafından yönlendirilmesi gerekir.

36
Jacob Swartwood

Sadece bir .htaccess dosyası oluşturdum ve ekledim:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI}

Basit!

14
MatHatrik
// Force HTTPS for security
if($_SERVER["HTTPS"] != "on") {
    $pageURL = "Location: https://";
    if ($_SERVER["SERVER_PORT"] != "80") {
        $pageURL .= $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] . $_SERVER["REQUEST_URI"];
    } else {
        $pageURL .= $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"];
    }
    header($pageURL);
}
9
Jeff

Yük dengeleyicinin arkasında çalışırken böyle bir şey yapmak zorunda kaldım. Şapka ucu https://stackoverflow.com/a/16076965/766172

function isSecure() {
    return (
        (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
     || $_SERVER['SERVER_PORT'] == 443
     || (
            (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
         || (!empty($_SERVER['HTTP_X_FORWARDED_SSL'])   && $_SERVER['HTTP_X_FORWARDED_SSL'] == 'on')
        )
    );
}

function requireHTTPS() {
    if (!isSecure()) {
        header('Location: https://' . $_SERVER['HTTP_Host'] . $_SERVER['REQUEST_URI'], TRUE, 301);
        exit;
    }
}
7
syvex

http://www.besthostratings.com/articles/force-ssl-htaccess.html

Bazen, kullanıcının güvenli bağlantı üzerinden sitenize göz attığından emin olmanız gerekebilir. Kullanıcıyı her zaman güvenli bağlantıya yönlendirmek için kolay bir yol (https: //), aşağıdaki satırları içeren bir .htaccess dosyasıyla gerçekleştirilebilir:

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

Lütfen, .htaccess'in web sitesinin ana klasöründe bulunması gerektiğini unutmayın.

HTTPS'yi belirli bir klasör için zorlamak istediğinizde kullanabilirsiniz:

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteCond %{REQUEST_URI} somefolder 
RewriteRule ^(.*)$ https://www.domain.com/somefolder/$1 [R,L]

.Htaccess dosyası, HTTPS'yi zorlamanız gereken klasöre yerleştirilmelidir.

5
itsazzad

Tamam .. Şimdi bununla ilgili tonlarca şey var ama kimse gerçekten. "Güvenli" sorusunu tamamlayamıyor. Benim için güvensiz bir şey kullanmak saçmadır.

Yem olarak kullanmazsan. 

$ _SERVER yayılımı nasıl bilen birinin isteği üzerine değiştirilebilir.

Ayrıca Sazzad Tushar Khan ve thebigjc’in de belirttiği gibi httaccess’i de kullanabiliyorsunuz ve burada onu içeren birçok cevap var.

Sadece ekle:

RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://example.com/$1 [R,L]

.ttaccess'inizde sahip olduğunuzun sonuna kadar.

Yine de bu iki araçla olabileceğimiz kadar güvenli değiliz.

Gerisi basit. Eğer eksik öznitelikler varsa, yani ...

if(empty($_SERVER["HTTPS"])){ // SOMETHING IS FISHY
}

if(strstr($_SERVER['HTTP_Host'],"mywebsite.com") === FALSE){// Something is FISHY
}


Ayrıca, httaccess dosyanızı güncellediğinizi ve şunları kontrol ettiğinizi de söyleyin:

if($_SERVER["HTTPS"] !== "on"){// Something is fishy
}

Kontrol edebileceğiniz çok daha fazla değişken var. 

Host_URI(Kontrol etmesi gereken statik nitelikler varsa)

HTTP_USER_AGENT(Aynı oturumda farklı değerler)

Öyleyse tüm söylediğim cevap bir arada yattığında sadece bir veya diğerine yetinmek değildir.

Daha fazla httaccess yeniden yazma bilgisi için bakınız docs-> http://httpd.Apache.org/docs/2.0/misc/rewriteguide.html

Burada bazı yığınlar -> .htaccess ve mod_rewrite kullanarak SSL/https zorla
ve
Geçerli sayfanın tam URL adresini alma (PHP)
bir çiftin ismini vermek için.

5
JSG

SSL olup olmadığını anlamak için $_SERVER['HTTPS'] kullanın ve değilse doğru yere yönlendirin.

Ve unutmayın, formu görüntüleyen sayfanın HTTPS üzerinden beslenmesi gerekmez, en çok ihtiyaç duyulan geri gönderme URL'sidir.

Edit: evet, aşağıda belirtildiği gibi, tüm sürecin HTTPS'de olması en iyisidir. Çok daha güven verici - Direğin en kritik kısım olduğuna işaret ediyordum. Ayrıca, herhangi bir çerezin güvenli olarak ayarlandığından emin olmanız gerekir, bu yüzden yalnızca SSL ile gönderilirler. Mod_rewrite çözümü de oldukça şık, kendi web sitemde birçok uygulamayı güvence altına almak için kullandım.

3
DGM

htaccess kullanın:

#if domain has www. and not https://
  RewriteCond %{HTTPS} =off [NC]
  RewriteCond %{HTTP_Host} ^(?i:www+\.+[^.]+\.+[^.]+)$
  RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [QSA,L,R=307]

#if domain has not www.
  RewriteCond %{HTTP_Host} ^([^.]+\.+[^.]+)$
  RewriteRule ^(.*)$ https://www.%{HTTP_Host}%{REQUEST_URI} [QSA,L,R=307]
3
siavash bagheri

Apache kullanıyorsanız veya .htaccess dosyalarını destekleyen LiteSpeed ​​gibi bir şey kullanıyorsanız, aşağıdakileri yapabilirsiniz: • Eğer bir .htaccess dosyanız yoksa, kök dizininizde (. Genellikle index.php'nin bulunduğu yer). Şimdi bu satırları .htaccess'inizdeki ilk yeniden yazma kuralları olarak ekleyin:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]

Tüm yeniden yazma kuralları için, .htaccess'inizde yalnızca bir kez "RewriteEngine On" komutuna ihtiyacınız vardır, bu nedenle zaten varsa, sadece ikinci ve üçüncü satırı kopyalayın.

Umarım bu yardımcı olur.

1
Antonio

Bunu kullanmak yeterli değil:

if($_SERVER["HTTPS"] != "on")
{
    header("Location: https://" . $_SERVER["HTTP_Host"] . $_SERVER["REQUEST_URI"]);
    exit();
}

Herhangi bir http içeriğiniz varsa (harici bir http resim kaynağı gibi), tarayıcı olası bir tehdit tespit eder. Kodunuzdaki tüm ref ve src dosyalarınızın https olduğundan emin olun.

1
bourax webmaster

IIS kullananları web.config'e bu satırı eklemek yardımcı olacaktır:

<httpProtocol>
    <customHeaders>
        <add name="Strict-Transport-Security" value="max-age=31536000"/>
    </customHeaders>
</httpProtocol>
<rewrite>
    <rules>
        <rule name="HTTP to HTTPS redirect" stopProcessing="true">
              <match url="(.*)" />
              <conditions>
                 <add input="{HTTPS}" pattern="off" ignoreCase="true" />
              </conditions>
              <action type="Redirect" redirectType="Found" url="https://{HTTP_Host}/{R:1}" />
         </rule>
    </rules>
</rewrite>

Tam bir örnek dosya

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <httpProtocol>
            <customHeaders>
                <add name="Strict-Transport-Security" value="max-age=31536000"/>
             </customHeaders>
        </httpProtocol>
        <rewrite>
            <rules>
                <rule name="HTTP to HTTPS redirect" stopProcessing="true">
                      <match url="(.*)" />
                      <conditions>
                         <add input="{HTTPS}" pattern="off" ignoreCase="true" />
                      </conditions>
                      <action type="Redirect" redirectType="Found" url="https://{HTTP_Host}/{R:1}" />
                 </rule>
            </rules>
       </rewrite>
   </system.webServer>
</configuration>
1
Tschallacka

HTTP ve HTTPS'yi aynı sayfada karıştırmayın. HTTP üzerinden sunulan bir form sayfanız varsa, veri gönderme konusunda gergin olacağım - Gönderinin bir Görünüm Kaynağı yapmadan ve bunun için arama yapmadan HTTPS veya HTTP üzerinden geçtiğini göremiyorum.

Formu HTTPS üzerinden sunma bağlantısıyla birlikte sunmak, avantaj için çok büyük bir değişiklik değildir.

1
JBB

$ _SERVER [HTTPS] durumunu kontrol etmekle ilgili birçok çözümde bulundum, ancak güvenilir görünmüyor çünkü bazen betiğin iç döngüye girmesine neden oluyor veya açmıyor, kapatıyor, vb. yönlendirir.

Sunucunuz $ _SERVER [SCRIPT_URI] özelliğini destekliyorsa işte en güvenilir çözüm.

if (stripos(substr($_SERVER[SCRIPT_URI], 0, 5), "https") === false) {
    header("location:https://$_SERVER[HTTP_Host]$_SERVER[REQUEST_URI]");
    echo "<meta http-equiv='refresh' content='0; url=https://$_SERVER[HTTP_Host]$_SERVER[REQUEST_URI]'>";
    exit;
}

Lütfen yüklemenize bağlı olarak, sunucunuzun $ _SERVER [SCRIPT_URI] özelliğini desteklemeyebileceğini unutmayın, ancak öyleyse, bu kullanılacak en iyi komut dosyasıdır.

Burada kontrol edebilirsiniz: Neden bazı PHP kurulumlarda $ _SERVER ['SCRIPT_URI'] var, diğerleri yok

0
Tarik

PHP yolu:

$is_https=false;
if (isset($_SERVER['HTTPS'])) $is_https=$_SERVER['HTTPS'];
if ($is_https !== "on")
{
    header("Location: https://".$_SERVER['HTTP_Host'].$_SERVER['REQUEST_URI']);
    exit(1);
}

Apache mod_rewrite yolu:

RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
0
Jay

Güvenlik nedeniyle yapmamalısın. Özellikle kurabiye burada ise. Çerez tabanlı tekrarlama saldırılarına tamamen açık olmanızı sağlar. 

Her iki durumda da, ayarlamak için Apache kontrol kurallarını kullanmalısınız.

Daha sonra HTTPS'nin etkin olup olmadığını test edebilir ve gerektiğinde gerektiği gibi yönlendirebilirsiniz. 

Sadece bir FORM POST (alma), Kullanarak ödeme sayfasına yönlendirmelisiniz ve POST olmadan diğer sayfalara yönlendirilmesi gerekir. (Bu insanları sadece sıcak zıplarlar.) 

http://joseph.randomnetworks.com/archives/2004/07/22/redirect-to-ssl-using-apaches-htaccess/

Başlamak için iyi bir yer, daha fazlasını sağlamadığınız için özür dilerim. Fakat gerçekte should, her şeyi SSL üzerinden kınamalısınız.

Aşırı koruyucu, ama en azından daha az endişeleniyorsun. 

0
Kent Fredric

belki bu yardımcı olabilir, siz, web sitem için yaptığım işte, bir cazibe gibi çalışır

$protocol = $_SERVER["HTTP_CF_VISITOR"];

if (!strstr($protocol, 'https')){
    header("Location: https://" . $_SERVER["HTTP_Host"] . $_SERVER["REQUEST_URI"]);
    exit();
}
0
Héouais Mongars