it-swarm-id.com

Bagaimana saya bisa memaksa pengguna untuk mengakses halaman saya melalui HTTPS alih-alih HTTP?

Saya hanya punya satu halaman yang ingin saya paksa untuk diakses sebagai halaman HTTPS (PHP di Apache). Bagaimana saya melakukan ini tanpa membuat seluruh direktori memerlukan HTTPS? Atau, jika Anda mengirimkan formulir ke halaman HTTPS dari halaman HTTP, apakah ia mengirimkannya dengan HTTPS alih-alih HTTP?

Ini contoh saya:

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

Saya hanya ingin diakses melalui:

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

Tentu, saya dapat menempatkan semua tautan ke halaman ini menunjuk ke versi HTTPS, tapi itu tidak menghentikan orang bodoh mengaksesnya melalui HTTP dengan sengaja ...

Satu hal yang saya pikir adalah mengarahkan redirect di header file PHP untuk memastikan bahwa mereka mengakses versi HTTPS:

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

Tapi itu tidak bisa menjadi cara yang benar, bukan?

BTW, harap tidak memperhatikan URL. Saya tahu bahwa jika itu sebenarnya halaman di mana ada kereta belanja, dll, Anda akan melakukannya dengan cara yang berbeda. Anggap saja sebagai halaman dari situs yang menjual satu item untuk satu harga di mana Anda mengetikkan informasi kartu kredit Anda untuk dikirimkan ke gateway pembayaran di situs eksternal untuk tujuan yang jelas menagih kartu Anda satu kali.

123
Wiki

Cara saya melakukannya sebelumnya pada dasarnya seperti apa yang Anda tulis, tetapi tidak memiliki nilai hardcoded:

if ($ _ SERVER ["HTTPS"]! = "on") 
 {
 header ("Lokasi: https: //". $ _SERVER ["HTTP_Host"]. $ _SERVER ["REQUEST_URI"]); keluar();
}
163
Adam Rosenfield

Anda bisa melakukannya dengan arahan dan mod_rewrite di Apache:

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

Anda dapat menjadikan Lokasi lebih pintar dari waktu ke waktu menggunakan ekspresi reguler jika Anda mau. 

45
thebigjc

Anda harus memaksa klien untuk meminta HTTPS selalu dengan HTTP Keamanan Transportasi Ketat (HSTS) header:

// 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();
}

Harap dicatat bahwa HSTS didukung di sebagian besar browser modern, tetapi tidak universal. Jadi logika di atas secara manual mengarahkan ulang pengguna terlepas dari dukungan jika mereka berakhir di HTTP, dan kemudian menetapkan header HSTS sehingga permintaan klien selanjutnya harus diarahkan oleh browser jika memungkinkan.

36
Jacob Swartwood

Saya baru saja membuat file .htaccess dan menambahkan:

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

Sederhana!

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

Harus melakukan sesuatu seperti ini ketika berlari di belakang penyeimbang beban. Kiat topi 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

Terkadang Anda mungkin perlu memastikan bahwa pengguna menelusuri situs Anda melalui koneksi yang aman. Cara mudah untuk selalu mengarahkan ulang pengguna ke koneksi aman (https: //) dapat dilakukan dengan file .htaccess yang berisi baris-baris berikut:

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

Harap perhatikan bahwa .htaccess harus berada di folder utama situs web.

Jika Anda ingin memaksa HTTPS untuk folder tertentu, Anda dapat menggunakan:

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

File .htaccess harus ditempatkan di folder tempat Anda harus memaksakan HTTPS.

5
itsazzad

Ok .. Sekarang ada banyak hal tentang ini sekarang tetapi tidak ada yang benar-benar menyelesaikan pertanyaan "Aman". Bagi saya itu konyol menggunakan sesuatu yang tidak aman.

Kecuali jika Anda menggunakannya sebagai umpan. 

Propagasi $ _SERVER dapat diubah atas kehendak seseorang yang tahu caranya.

Juga sebagai Sazzad Tushar Khan dan thebigjc menyatakan Anda juga dapat menggunakan httaccess untuk melakukan ini dan ada banyak jawaban di sini yang berisi itu.

.__ Cukup tambahkan:

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

ke akhir dari apa yang Anda miliki di .httaccess Anda dan hanya itu.

Namun kita masih tidak seaman mungkin dengan 2 alat ini.

Sisanya sederhana. Jika ada atribut yang hilang yaitu ...

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

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


Juga katakan Anda telah memperbarui file httaccess Anda dan Anda memeriksa:

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

Ada banyak variabel lagi yang dapat Anda periksa yaitu .. 

Host_URI(Jika ada atribut statis untuk diperiksa)

HTTP_USER_AGENT(Nilai berbeda sesi yang sama)

Jadi semua yang saya katakan adalah jangan hanya puas dengan satu atau yang lain ketika jawabannya terletak pada kombinasi.

Untuk info penulisan ulang httaccess selengkapnya, lihat docs-> http://httpd.Apache.org/docs/2.0/misc/rewriteguide.html

Beberapa Tumpukan di sini -> Paksa SSL/https menggunakan .htaccess dan mod_rewrite
dan
Mendapatkan URL lengkap dari halaman saat ini (PHP)
untuk menyebutkan pasangan.

5
JSG

Gunakan $_SERVER['HTTPS'] untuk mengetahui apakah itu SSL , dan arahkan ke tempat yang tepat jika tidak.

Dan ingat, halaman yang menampilkan formulir tidak perlu dimasukkan melalui HTTPS, itu adalah URL postingan yang paling membutuhkannya.

Edit: ya, seperti yang ditunjukkan di bawah ini, yang terbaik adalah memiliki seluruh proses dalam HTTPS. Ini jauh lebih meyakinkan - saya menunjukkan bahwa posting adalah bagian paling kritis. Selain itu, Anda harus berhati-hati bahwa cookie apa pun diatur agar aman, sehingga cookie hanya akan dikirim melalui SSL. Solusi mod_rewrite juga sangat bagus, saya telah menggunakannya untuk mengamankan banyak aplikasi di situs web saya sendiri.

3
DGM

gunakan htaccess:

#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

Jika Anda menggunakan Apache atau sesuatu seperti LiteSpeed, yang mendukung file .htaccess, Anda dapat melakukan yang berikut ini ... Jika Anda belum memiliki file .htaccess, Anda harus membuat file .htaccess baru di direktori root Anda (biasanya di mana index.php Anda berada). Sekarang tambahkan baris ini sebagai aturan penulisan ulang pertama di .htaccess Anda:

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

Anda hanya perlu instruksi "RewriteEngine On" sekali dalam .htaccess Anda untuk semua aturan penulisan ulang, jadi jika Anda sudah memilikinya, cukup salin baris kedua dan ketiga.

Saya harap ini membantu.

1
Antonio

Menggunakan ini TIDAK cukup:

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

Jika Anda memiliki konten http (seperti sumber gambar http eksternal), browser akan mendeteksi kemungkinan ancaman. Jadi pastikan semua ref dan src Anda di dalam kode Anda adalah https

1
bourax webmaster

Bagi mereka yang menggunakan IIS menambahkan baris ini di web.config akan membantu:

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

File contoh lengkap

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

Jangan gabungkan HTTP dan HTTPS pada halaman yang sama. Jika Anda memiliki halaman formulir yang dilayani melalui HTTP, saya akan gugup mengirim data - saya tidak bisa melihat apakah pengiriman melewati HTTPS atau HTTP tanpa melakukan Sumber Tampilan dan mencari.

Melayani formulir di atas HTTPS bersama dengan tautan kirim bukan merupakan perubahan yang berat untuk keuntungan.

1
JBB

Saya telah melalui banyak solusi dengan memeriksa status $ _SERVER [HTTPS]} tetapi sepertinya itu tidak dapat diandalkan karena kadang-kadang tidak disetel atau disetel ke on, off, dll. Menyebabkan script ke loop internal redirect.

Ini adalah solusi paling andal jika server Anda mendukung $ _SERVER [SCRIPT_URI]

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

Harap perhatikan bahwa tergantung pada instalasi Anda, server Anda mungkin tidak mendukung $ _SERVER [SCRIPT_URI] tetapi jika ya, ini adalah skrip yang lebih baik untuk digunakan.

Anda dapat memeriksa di sini: Mengapa beberapa instalasi PHP memiliki $ _SERVER ['SCRIPT_URI'] dan lainnya tidak

0
Tarik

Cara PHP:

$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);
}

Cara mod_rewrite Apache:

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

Anda tidak boleh karena alasan keamanan. Terutama jika cookie sedang dimainkan di sini. Ini membuat Anda terbuka lebar untuk serangan replay berbasis cookie. 

Apa pun itu, Anda harus menggunakan aturan kontrol Apache untuk menyetelnya.

Kemudian Anda dapat menguji HTTPS yang diaktifkan dan mengarahkan sesuai kebutuhan di mana diperlukan. 

Anda harus mengalihkan ke halaman pembayaran hanya menggunakan FORMULIR POST (tidak mendapatkan), Dan akses ke halaman tanpa POST harus diarahkan kembali ke halaman lain. (Ini akan menangkap orang-orang hanya lompat panas.) 

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

Adalah tempat yang baik untuk memulai, permintaan maaf karena tidak menyediakan lebih banyak. Tapi Anda benar-benar harus mendorong semuanya melalui SSL.

Ini terlalu protektif, tetapi setidaknya Anda memiliki sedikit kekhawatiran. 

0
Kent Fredric

mungkin yang ini bisa membantu, Anda, itulah yang saya lakukan untuk situs web saya, ini berfungsi seperti pesona:

$protocol = $_SERVER["HTTP_CF_VISITOR"];

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