php - site - Detecta SSL cuando el proxy*siempre*reclama una conexión segura
site not https moodle (3)
Quiero detectar si un usuario está viendo una página segura y redirigir si no (para iniciar sesión).
Sin embargo, mi sitio viaja a través de un proxy antes de ver las variables del servidor y el proxy (en este momento) me dice que $_SERVER[''HTTPS'']
está ''on''
cuando el URI indica claramente lo contrario. También muestra ''on''
cuando el usuario navega ''de forma segura''.
Navegando a través de http://
y https://
$_SERVER[''SERVER_PORT'']
ambos $_SERVER[''SERVER_PORT'']
= 443
.
No tengo la capacidad de realizar ningún cambio en el proxy, así que quiero saber:
- ¿Tiene PHP otras opciones para detectar la verdad o ...
- ¿Estoy atascado para recurrir a los mecanismos de JavaScript para la detección y la redirección?
Aproveché esta pregunta para obtener ideas, pero en su mayoría giran en torno a la variable $_SERVER[''HTTPS'']
siendo confiable. ¡Bah!
Parece que esta pregunta está experimentando al menos algo similar, pero fue capaz de resolverlo al adaptar una solución apache.
¿Hay otras variables o trucos de PHP SERVER disponibles para detectar con qué comienza el URI del usuario? La única diferencia entre las variables $ _SERVER cuando mi sitio se visualiza http frente a https es la siguiente:
- _FCGI_X_PIPE_ (aparece al azar)
- HTTP_COOKIE (sto-id-47873 está incluido en la versión no segura pero no lo puse allí)
- REMOTE_ADDR (¡Esto y los dos siguientes siguen cambiando inexplicablemente!)
- SERVIDOR REMOTO
- REMOTE_PORT (''personas proxy'', ¿por qué cambias continuamente esto?)
¿Alguno de estos elementos es lo suficientemente fuerte como para soportar el peso sin que se astille y cause dolor después? Tal vez no debería confiar en nada filtrado a través del proxy, ya que podría cambiar en cualquier momento dado.
Aquí está mi plan para usar JavaScript para este propósito; es lo mejor que tengo?
function confirmSSL() {
if(location.protocol != "https:") {
var locale = location.href;
locale = locale.replace(/http://///,"https://");
location.replace(locale);
}
}
<body onLoad="confirmSSL()">...
Creo que si el usuario tiene JavaScript desactivado en mi comunidad, entonces ojalá sepan lo que están haciendo. Deberían poder acceder a una zona segura manualmente. ¿Qué tipo de sugerencias de <noscript>
serían comunes / buenas prácticas? ¿Algo como esto, quizás ?:
<noscript>
Navegue usando https: //blah.more.egg/fake para proteger su información.</noscript>
Las soluciones PHP que funcionan (con una buena explicación) tendrán preferencia por la respuesta correcta. Siéntase libre de enviar una mejor implementación de JavaScript o un enlace a uno.
¡Muchas gracias!
Solo use el enfoque del lado del cliente. Si su proxy no es configurable, esa opción está desactivada. Detectar y redirigir a través de js está bien.
También hay una manera de lograr la redirección sin javascript del lado del cliente. Este método puede ser especialmente útil si JavaScript está deshabilitado en el navegador del cliente.
Los pasos son PHP puro y bastante simple:
- Comience una sesión
- Si es una sesión nueva, redirija a la ubicación
https
- Si la sesión no es nueva, se puede suponer que el usuario ha sido redirigido
Código de ejemplo:
<?php
session_start();
if( !isset($_SESSION[''runningOnHttps'']) ) {
$_SESSION[''runningOnHttps''] = true;
header(''Location: https://my-cool-secure-site.com'');
}
?>
Naturalmente, podría restringir esta funcionalidad a aquellos navegadores con JavaScript desactivado para crear una especie de ''modo híbrido'': cuando haya una sesión nueva con un navegador que no sea JS, realice una solicitud a algún tipo de script de devolución de llamada que notifique al servidor para enviar un encabezado de ubicación:
some_landingpage.php envía un <noscript>
inicial que contiene un iframe oculto, que cargará redirect.php:
if( !isset($_SESSION[''checkWasMade'']) ) {
$_SESSION[''checkWasMade''] = true;
echo ''<noscript>
<iframe src="redirect.php" style="visibility: hidden; position: absolute; left: -9000px;"></iframe>
</noscript>'';
}
Una solicitud de redirect.php le informará que JavaScript está deshabilitado y le dará la oportunidad de forzar la redirección al enviar un encabezado de Location
(ver arriba) con la siguiente solicitud real.
Como cuestión de rutina, este método solo funcionará de manera confiable, si el protocolo no cambia (¿mágicamente?) Durante una sesión.
ACTUALIZAR:
Todo el método mencionado anteriormente para manejar agentes de usuario que no son de JavaScript podría dejarse sin efecto por un enfoque aún más ordenado:
Acabo de enterarme de que <noscript>
también se puede incluir dentro de <head>
, lo que permite redireccionar a través de etiquetas <meta>
.
Por lo tanto, some_landingpage.php podría enviar una meta-actualización inicial dentro de <noscript>
:
// The following echo must appear inside the html head
if( !isset($_SESSION[''checkWasMade'']) ) {
$_SESSION[''checkWasMade''] = true;
echo ''<noscript>
<meta HTTP-EQUIV="REFRESH" content="0; url=https://my-cool-secure-site.com">
</noscript>'';
}
Aunque ya se discutió parcialmente en los comentarios de la pregunta, resumiré algunas sugerencias sobre la lógica de redirección en JavaScript:
- En general
location
se recomienda utilizarwindow.location
lugar delocation
, aquí encontrará una explicación. - Regex parece un poco exagerado para un simple reemplazo del protocolo.
- La lógica de redirección debe ejecutarse lo antes posible, ya que en caso de redirección, cada procesamiento adicional de documentos es innecesario.
- Los navegadores con JavaScript deshabilitado deberían mostrar al menos una notificación para que el usuario cambie a https.
Sugiero usar el siguiente código (adoptado desde aquí ), que es corto y eficiente:
<head>
<script type="text/javascript">
if (window.location.protocol != "https:") {
window.location.href = "https:" + window.location.href.substring(window.location.protocol.length);
}
</script>
...
</head>
<body>
...
<noscript>Please click <a href="https://my-cool-secure-site.com">here</a> to use a secure connection!</noscript>
...