[Php] ¿Cómo puedo obligar a los usuarios a acceder a mi página a través de HTTPS en lugar de HTTP?


Answers

Puedes hacerlo con una directiva y mod_rewrite en Apache:

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

Puede hacer que la Ubicación sea más inteligente con el tiempo utilizando expresiones regulares si lo desea.

Question

Solo tengo una página a la que quiero forzar para acceder como página HTTPS (PHP en Apache). ¿Cómo hago esto sin hacer que todo el directorio requiera HTTPS? O bien, si envía un formulario a una página HTTPS desde una página HTTP, ¿lo envía mediante HTTPS en lugar de HTTP?

Aquí está mi ejemplo:

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

Quiero que solo se pueda acceder a través de:

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

Claro, puedo poner todos los enlaces a esta página apuntando a la versión HTTPS, pero eso no impide que algunos tontos accedan a él a través de HTTP a propósito ...

Una cosa que pensé fue colocar un redireccionamiento en el encabezado del archivo PHP para verificar que estén accediendo a la versión HTTPS:

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

Pero ese no puede ser el camino correcto, ¿verdad?

Por cierto, no preste atención a la URL. Sé que si fuera en realidad una página donde hubiera un carrito de compras, etc., lo haría de otra manera. Piénselo como una página de un sitio que vende un artículo por un precio en el que escribe la información de su tarjeta de crédito para enviarla a un portal de pago en un sitio externo con el propósito expreso de cargar su tarjeta una vez.




Usar esto NO es suficiente:

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

Si tiene algún contenido http (como una fuente de imagen http externa), el navegador detectará una posible amenaza. Así que asegúrese de que todos sus ref y src dentro de su código sean https




Acabo de crear un archivo .htaccess y agregué:

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

Sencillo !




He usado este script y funciona bien a través del sitio.

if(empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] == "off"){
    $redirect = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    enter code hereheader('HTTP/1.1 301 Moved Permanently');
    header('Location: ' . $redirect);
    exit();
}



He pasado por muchas soluciones con la comprobación del estado de $ _SERVER [HTTPS] pero parece que no es confiable porque a veces no se establece o no se activa, desactiva, etc., lo que hace que el script redirija el bucle interno.

Esta es la solución más confiable si su servidor admite $ _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;
}

Tenga en cuenta que, dependiendo de su instalación, es posible que su servidor no admita $ _SERVER [SCRIPT_URI], pero si lo hace, este es el mejor script que debe usar.

Puede verificar aquí: ¿Por qué algunas instalaciones de PHP tienen $ _SERVER ['SCRIPT_URI'] y otras no




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



No deberías por razones de seguridad. Especialmente si las cookies están en juego aquí. Te deja abierto a los ataques de repetición basados ​​en cookies.

De cualquier manera, debe usar las reglas de control de Apache para sintonizarlo.

Luego puede probar que se habilite HTTPS y redireccionar según sea necesario cuando sea necesario.

Debe redirigir a la página de pago solo con un FORMATO POST (no obtener), y los accesos a la página sin un POST deben dirigirse a las otras páginas. (Esto atrapará a la gente simplemente saltando en caliente.)

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

Es un buen lugar para comenzar, disculpas por no proporcionar más. Pero deberías empujar todo a través de SSL.

Es sobreprotector, pero al menos tienes menos preocupaciones.




Ok ... Ahora hay toneladas de cosas sobre esto ahora pero nadie realmente completa la pregunta "Segura". Para mí es ridículo usar algo que es inseguro.

A menos que lo uses como cebo.

La propagación $ _SERVER se puede cambiar a voluntad de alguien que sepa cómo hacerlo.

También como Sazzad Tushar Khan y thebigjc declararon que también puedes usar httaccess para hacer esto y hay muchas respuestas aquí que lo contienen.

Solo agrega:

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

hasta el final de lo que tienes en tu .httaccess y eso es todo.

Todavía no estamos tan seguros como podemos con estas 2 herramientas.

El resto es simple. Si faltan atributos, es decir ...

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

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


También di que has actualizado tu archivo httaccess y compruebas:

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

Hay muchas más variables que puedes verificar, es decir ...

HOST_URI (Si hay atributos estáticos para verificar)

HTTP_USER_AGENT (valores diferentes de la misma sesión)

Así que todo lo que estoy diciendo es que no te conformas con uno o el otro cuando la respuesta está en una combinación.

Para obtener más información de reescritura de httaccess, consulte los documentos-> http://httpd.apache.org/docs/2.0/misc/rewriteguide.html

Algunas pilas aquí -> Forzar SSL / https usando .htaccess y mod_rewrite
y
Obtener la URL completa de la página actual (PHP)
para nombrar una pareja.




Tuve que hacer algo como esto cuando corría detrás de un equilibrador de carga. Punta de sombrero https://.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;
    }
}



Links