2012-02-03 19 views
5

Tengo un formulario de acceso:cómo redirigir la página a https en php?

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

Me gustaría que la página login.php para redirigir a la utilización de https.

No quiero enviar al usuario al https://.../login.php porque pueden cambiar el enlace. pero quiero hacer una redirección en el lado del servidor antes de analizar los datos del formulario de inicio de sesión y registrar el usuario en

he encontrado y el ejemplo:.

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

pero no tengo $_SERVER["HTTPS"] si var_dump($_SERVER);

tengo $_SERVER['SERVER_PORT'] bruja es 80.

alguna idea?

Gracias

+0

"No quiero enviar al usuario ..." "quiero hacer una redirección "Los dos son mutuamente incompatibles. ¿Quieres forzar al usuario a usar SSL? Si es así, debe redirigir (enviar) al usuario a la versión HTTPS del formulario de inicio de sesión. –

+0

'pero no tengo', por supuesto, no lo tendrá cuando se conecte con 'HTTP' normal. Y el puerto 80 dice lo mismo. '$ _SERVER [" HTTPS "] = 'on';' cuando está conectado a través de HTTPS y su puerto en ese caso sería '443'. Su secuencia de comandos está haciendo lo correcto, comprueba si la conexión actual es HTTP y, en caso contrario, redirige a la versión de HTTPS. – Cheery

+0

podría, pero existe la posibilidad de que el usuario cambie el enlace a HTTP. Necesito hacer una comprobación en la página login.php para HTTPS – Patrioticcow

Respuesta

6

Si se les permite publicar a través de HTTP /login.php llanura y luego redirigen a HTTPS, es incompatible con el fin de utilizar HTTPS porque la información de inicio de sesión ya ha sido enviada en texto plano en internet .

Lo que podría hacer para evitar que el usuario cambie la URL, es hacerlo para que la página de inicio de sesión rechace el inicio de sesión si no es a través de HTTPS.

Lo que yo uso para comprobar si el uso de HTTPS es la siguiente:

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

Si está ejecutando su servidor seguro en el puerto predeterminado de 443, entonces usted puede también comprobar para ver si ese es el puerto, pero PHP establece el valor $_SERVER['HTTPS'] para que no esté vacío si se usa SSL, así que verificaría la presencia de eso para la mejor práctica.

EDIT:

Si el usuario está incluido por lo que cambiar manualmente el https a http y quiere enviar su información a través de texto plano, no hay nada que pueda hacer para detenerlos, pero si usted no permitir inicio de sesión a través de HTTP, por lo que incluso la información correcta no los registrará, puede obligarlos a usar https haciéndolo lo único que funciona.

+0

Sí, agregue esa marca a login.php cerca del comienzo del script. Puede hacer varias cosas, desde simplemente denegar el inicio de sesión con un error que indique que se requiere https, o usar un encabezado 301 para redirigirlo a https. – drew010

5

Cualquiera que sea la página que se utiliza para mostrar el formulario de inicio de sesión ya debería estar utilizando https://antes el formulario es llenado, y luego se debe enviar a otra dirección de https://. De lo contrario, dejarás el formulario abierto para atacar.

Puede consultar mod_rewrite para redirigir automáticamente cualquier solicitud usando http:// a https://, al menos para su página de inicio de sesión.

+0

Siempre que el formulario se publique en https, no importa si el formulario está en una página que no sea https. – drew010

+0

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

+0

Es cierto que el html de la página de destino podría ser modificado por un hombre de el medio, pero los datos seguirán encriptados si se publican en una página HTTPS. Para obtener la mejor práctica, generalmente obligo a todo el sitio a usar SSL y no solo páginas específicas. Siguiendo esa guía, también debe hacer su formulario de inicio de sesión en https. – drew010

3

Suponiendo que su página con el formulario de inicio de sesión se genera por index.php, debe poner el código de ejemplo para la redirección HTTP a HTTPS en index.php. Esto asegurará que cuando el usuario rellene el formulario y lo envíe, se envíe al /login.php a través de HTTPS y no a través de HTTP.

Poner esta comprobación en el interior login.php es inútil porque en el momento login.php recibe la solicitud y trata de redirigir a la URL HTTPS correspondiente, así, las credenciales ya han sido sometidos a ella como texto sin formato, que es lo que debe querer evitar.

La observación de que ves $_SERVER['SERVER_PORT'] sea 80 y $_SERVER["HTTPS"] a ser no establece cuando se pone el cheque dentro login.php es una prueba más del hecho de que credenciales de acceso están siendo sometidos a ella a través de HTTP y por lo tanto las credenciales de acceso están llegando su servidor del cliente sin cifrar. Esto debe evitarse siguiendo lo que dije en el primer párrafo de esta respuesta.

Por cierto, yo no usaría PHP para hacer este tipo de redirección. Tales redirecciones son manejadas muy convenientemente por mod_rewrite en Apache HTTPD.

Un ejemplo, en el supuesto de que la página de inicio de sesión está disponible en la 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(); 
} 
Cuestiones relacionadas