2012-02-03 12 views
5

Ho un form di login:come reindirizzare la pagina a https in php?

<form method =POST action="/login.php"> 
... 
</form> 

Vorrei pagina login.php per reindirizzare ad usare https.

Non voglio inviare l'utente a https://.../login.php perché potrebbero cambiare il collegamento. ma voglio fare un redirect lato server prima di analizzare i dati del modulo di login e accedere l'utente in

ho trovato e l'esempio:.

if($_SERVER["HTTPS"] != "on") { 
    header("HTTP/1.1 301 Moved Permanently"); 
    header("Location: "https://" . $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"]); 
    exit(); 
} 

ma non ho $_SERVER["HTTPS"] se mi var_dump($_SERVER);

io ho $_SERVER['SERVER_PORT'] strega è 80.

tutte le idee?

Grazie

+0

"Io non voglio inviare l'utente ..." "Io voglio fare un redirect "I due sono reciprocamente incompatibili. Vuoi forzare l'utente a usare SSL? In tal caso, è necessario reindirizzare (inviare) l'utente alla versione HTTPS del modulo di accesso. –

+0

'ma non ho 'ovviamente non lo avrete quando ci si connette con il normale' HTTP'. E la porta 80 dice lo stesso. '$ _SERVER [" HTTPS "] = 'on';' quando sei connesso tramite HTTPS e la tua porta in quel caso sarebbe '443'. Lo script sta facendo la cosa giusta, controlla se la connessione corrente è HTTP e, in caso contrario, reindirizza alla versione HTTPS. – Cheery

+0

potrei, ma c'è la possibilità per l'utente di cambiare il link a HTTP. Devo fare un controllo sulla pagina login.php per HTTPS – Patrioticcow

risposta

6

Se si consente loro di inviare a /login.php su HTTP pianura e quindi reindirizzare a HTTPS, a sconfiggere lo scopo di utilizzare HTTPS, perché le informazioni di login è già stata inviata in formato testo su internet .

Cosa si può fare per impedire all'utente di modificare l'URL, è fare in modo che la pagina di accesso rifiuti l'accesso se non è su HTTPS.

Quello che uso per verificare l'uso di HTTPS è il seguente:

if (!isset($_SERVER['HTTPS']) || !$_SERVER['HTTPS']) { 
    // request is not using SSL, redirect to https, or fail 
} 

Se si esegue il server sicuro sulla porta predefinita di 443, allora si può anche verificare se questo è il porta, ma PHP imposta il valore $_SERVER['HTTPS'] su non vuoto se SSL viene utilizzato, quindi vorrei verificare la presenza di ciò per la migliore pratica.

EDIT:

Se l'utente è quindi incluso per modificare manualmente le HTTPS per http e desidera inviare le loro informazioni sul testo normale, non c'è niente che puoi fare per fermarli, ma se si disabilitano login su HTTP, quindi anche le informazioni corrette non le registreranno, puoi forzarle a usare https rendendola l'unica cosa che funziona.

+0

Sì, aggiungi questo controllo a login.php vicino all'inizio dello script. Potresti fare diverse cose, dal solo negare il login con un errore che dice che https è richiesto, o usare un'intestazione 301 per reindirizzare a https. – drew010

5

Qualunque sia la pagina che si utilizza per visualizzare il form di login dovrebbe già essere utilizzando https://prima il modulo viene compilato, e poi dovrebbe essere presentata ad un altro indirizzo https://. Altrimenti, lascerai il modulo aperto per attaccare.

È possibile esaminare mod_rewrite per reindirizzare automaticamente qualsiasi richiesta utilizzando http:// a https://, almeno per la pagina di accesso.

+0

Fintanto che il modulo viene pubblicato su https, non importa se il modulo stesso si trova su una pagina non-https. – drew010

+0

@ drew010: http://security.stackexchange.com/questions/1692/is-posting-from-http-to-https-a-bad-practice – Crontab

+0

Vero l'html della pagina di destinazione potrebbe essere modificato da un uomo-in- the-middle, ma i dati verranno comunque crittografati se pubblicati su una pagina HTTPS. Per le migliori pratiche, di solito obbligo l'intero sito a utilizzare SSL e non solo pagine specifiche. Seguendo questa guida, dovresti anche creare il tuo modulo di login su https. – drew010

3

Supponendo che la pagina con il modulo di accesso sia generata da index.php, è necessario inserire il codice di esempio per il reindirizzamento da HTTP a HTTPS in index.php. Ciò garantirà che quando l'utente compila il modulo e lo invia, viene inviato a /login.php tramite HTTPS e non HTTP.

Mettendo questo controllo all'interno login.php è inutile perché per il momento login.php ottiene la richiesta e cerca di reindirizzare al corrispondente URL HTTPS, beh, le credenziali sono già state presentate ad esso in testo semplice che è quello che si dovrebbe voler evitare.

L'osservazione che si vede $_SERVER['SERVER_PORT'] essere 80 e $_SERVER["HTTPS"] di non essere impostata quando si inserisce il controllo all'interno login.php è un'ulteriore prova del fatto che le credenziali di accesso vengono sottoposti ad esso tramite HTTP e quindi le credenziali di accesso stanno raggiungendo il tuo server dal client non criptato. Questo deve essere evitato seguendo ciò che ho detto nel primo paragrafo di questa risposta.

BTW, non userei PHP per fare questo tipo di reindirizzamento. Tali reindirizzamenti sono gestiti molto comodamente da mod_rewrite in Apache HTTPD.

Un esempio, supponendo che la pagina di accesso è disponibile presso l'URL, http://example.com/foo/:

RewriteEngine On 
RewriteCond %{HTTPS} off 
RewriteRule ^foo/$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L] 
5
if($requireSSL && $_SERVER['SERVER_PORT'] != 443) { 
    header("HTTP/1.1 301 Moved Permanently"); 
    header("Location: https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']); 
    exit(); 
}