it-swarm.it

Come posso costringere gli utenti ad accedere alla mia pagina su HTTPS anziché su HTTP?

Ho solo una pagina che voglio forzare per accedere a una pagina HTTPS (PHP su Apache). Come posso fare questo senza che l'intera directory richieda HTTPS? Oppure, se si invia un modulo a una pagina HTTPS da una pagina HTTP, lo invia tramite HTTPS anziché HTTP?

Ecco il mio esempio:

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

Voglio che sia accessibile solo attraverso:

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

Certo, posso mettere tutti i link a questa pagina puntati alla versione HTTPS, ma ciò non impedisce a qualche pazzo di accedervi tramite HTTP apposta ...

Una cosa che pensavo stava mettendo un reindirizzamento nell'intestazione del file PHP per verificare che stessero accedendo alla versione HTTPS:

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

Ma non può essere la strada giusta, vero?

A proposito, per favore non prestare attenzione all'URL. So che se fosse effettivamente una pagina in cui c'era un carrello della spesa, ecc., Lo faresti in un modo diverso. Pensala come una pagina di un sito che vende un articolo per un prezzo in cui digiti i dati della tua carta di credito da inviare a un gateway di pagamento su un sito esterno con l'esplicito scopo di addebitare la tua carta una volta.

123
Wiki

Il modo in cui l'ho fatto prima è fondamentalmente simile a quello che hai scritto, ma non ha alcun valore scritto a codice:

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

Potresti farlo con una direttiva e mod_rewrite su Apache:

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

Puoi rendere la Location più intelligente nel tempo usando le espressioni regolari se vuoi. 

45
thebigjc

Dovresti forzare il client a richiedere HTTPS sempre con Intestazioni HTTP Transport Security (HSTS):

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

Tieni presente che HSTS è supportato nella maggior parte dei browser moderni, ma non universale. Pertanto, la logica precedente reindirizza manualmente l'utente indipendentemente dal supporto se finisce su HTTP e quindi imposta l'intestazione HSTS in modo che eventuali richieste client vengano reindirizzate dal browser, se possibile.

36
Jacob Swartwood

Ho appena creato un file .htaccess e ho aggiunto:

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

Semplice!

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

Doveva fare qualcosa di simile quando si correva dietro un bilanciamento del carico. Suggerimento per Hat 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

A volte potrebbe essere necessario assicurarsi che l'utente stia navigando nel tuo sito tramite connessione protetta. Un modo semplice per reindirizzare sempre l'utente alla connessione protetta (https: //) può essere ottenuto con un file .htaccess contenente le seguenti righe:

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

Si prega di notare che il file .htaccess dovrebbe trovarsi nella cartella principale del sito web.

Nel caso in cui desideri forzare HTTPS per una determinata cartella puoi utilizzare:

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

Il file .htaccess deve essere inserito nella cartella in cui è necessario forzare HTTPS.

5
itsazzad

Ok .. Ora ci sono un sacco di cose su questo ora, ma nessuno completa la domanda "Secure" Per me è ridicolo usare qualcosa di insicuro.

A meno che non lo usi come esca. 

La propagazione $ _SERVER può essere modificata a volontà di qualcuno che sa come.

Anche come Sazzad Tushar Khan e thebigjc hanno dichiarato che puoi usare anche httaccess per fare questo e ci sono molte risposte qui che lo contengono.

Basta aggiungere:

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

alla fine di ciò che hai nel tuo .httaccess e questo è quello.

Ancora non siamo sicuri quanto possiamo essere con questi 2 strumenti.

Il resto è semplice. Se mancano attributi cioè ...

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

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


Dite anche di aver aggiornato il file httaccess e controllate:

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

Ci sono molte più variabili che puoi controllare, ad es. 

Host_URI(Se ci sono attributi statici a riguardo)

HTTP_USER_AGENT(Stessa sessione valori diversi)

Quindi tutto ciò che sto dicendo è che non accontentarsi dell'uno o dell'altro quando la risposta sta in una combinazione.

Per ulteriori informazioni sulla riscrittura di httaccess, consultare i documenti-> http://httpd.Apache.org/docs/2.0/misc/rewriteguide.html

Alcuni stack qui -> Forza SSL/https usando .htaccess e mod_rewrite
e
Ottenere l'URL completo della pagina corrente (PHP)
per nominare una coppia.

5
JSG

Usa $_SERVER['HTTPS'] per dire se è SSL , e reindirizza al posto giusto se non lo è.

E ricorda, la pagina che visualizza il modulo non ha bisogno di essere alimentata tramite HTTPS, è l'URL post back che ne ha più bisogno.

Modifica: sì, come indicato di seguito, è meglio avere l'intero processo in HTTPS. È molto più rassicurante - sottolineo che il post è la parte più critica. Inoltre, è necessario assicurarsi che tutti i cookie siano impostati per essere sicuri, quindi verranno inviati solo tramite SSL. La soluzione mod_rewrite è anche molto elegante, l'ho usata per proteggere molte applicazioni sul mio sito web.

3
DGM

usa 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

Se usi Apache o qualcosa come LiteSpeed, che supporta i file .htaccess, puoi fare ciò che segue . Se non hai già un file .htaccess, dovresti creare un nuovo file .htaccess nella tua directory root (di solito dove si trova index.php). Ora aggiungi queste righe come prime regole di riscrittura nel tuo .htaccess:

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

Hai solo bisogno dell'istruzione "RewriteEngine On" una volta nel tuo .htaccess per tutte le regole di riscrittura, quindi se lo hai già, copia semplicemente la seconda e la terza riga.

Spero che questo possa essere d'aiuto.

1
Antonio

L'utilizzo di questo NON è sufficiente:

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

Se si dispone di un contenuto http (come una fonte di immagini http esterna), il browser rileverà una possibile minaccia. Quindi assicurati che tutti i tuoi ref e src all'interno del tuo codice siano https

1
bourax webmaster

Per coloro che utilizzano IIS l'aggiunta di questa riga nel web.config aiuterà:

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

Un file di esempio completo

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

Non combinare HTTP e HTTPS sulla stessa pagina. Se si dispone di una pagina di modulo che viene pubblicata tramite HTTP, sarò nervoso sull'invio di dati: non riesco a vedere se l'invio va su HTTPS o HTTP senza creare una View Source e cercare di farlo.

Servire il modulo su HTTPS insieme al link di invio non è un grosso cambiamento per il vantaggio.

1
JBB

Ho attraversato molte soluzioni controllando lo stato di $ _SERVER [HTTPS] ma sembra che non sia affidabile perché a volte non viene impostato o impostato su on, off, ecc. Causando lo script al loop interno reindirizzare.

Ecco la soluzione più affidabile se il tuo server supporta $ _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;
}

Si noti che a seconda dell'installazione, il server potrebbe non supportare $ _SERVER [SCRIPT_URI], ma se lo fa, questo è lo script migliore da utilizzare.

Puoi controllare qui: Perché alcune installazioni PHP hanno $ _SERVER ['SCRIPT_URI'] e altre no

0
Tarik

Il modo 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);
}

Il modo mod_rewrite di Apache:

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

Non dovresti per motivi di sicurezza. Soprattutto se i biscotti sono in gioco qui. Ti lascia completamente aperto agli attacchi di replay basati sui cookie. 

Ad ogni modo, dovresti usare le regole di controllo di Apache per ottimizzarlo.

Quindi è possibile testare l'abilitazione di HTTPS e il reindirizzamento quando necessario. 

Dovresti reindirizzare alla pagina di pagamento solo usando FORM POST (no get), E gli accessi alla pagina senza POST devono essere indirizzati alle altre pagine. (Questo attirerà le persone che saltano rapidamente.) 

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

È un buon punto di partenza, mi scuso per non aver fornito di più. Ma davvero dovrebbe spingere tutto attraverso SSL.

È troppo protettivo, ma almeno hai meno preoccupazioni. 

0
Kent Fredric

forse questo può aiutarti, tu, è così che ho fatto per il mio sito web, funziona come un incantesimo:

$protocol = $_SERVER["HTTP_CF_VISITOR"];

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