¿Navegar o no por HTTPS afecta a nuestra aplicaciones en PHP?
Cuando realizamos nuestras aplicaciones en PHP no solemos tener en cuenta si se va a navegar a través de un protocolo seguro o no. Esto es, sin lugar a dudas, un grave error.
Si a la hora de crear nuestro sitio web utilizamos siempre rutas relativas a nuestro dominio, lo normal es que no tengamos problemas y nuestra aplicación funcione sin problemas tanto en http como en https.
Sin embargo, hay situaciones en las que se utilizan URL’s absolutas o, simplemente, nuestra aplicación tiene que comportarse de una forma diferente si estamos bajo entorno seguro o no. En estos casos, necesitamos que nuestra aplicación PHP sepa si la navegación se realiza a través de protocolo seguro o no.
Cómo saber si navegas por https en PHP
El lenguaje PHP nos proporciona una variable superglobal llamada $_SERVER, un array de datos relacionados con el servidor y con las diferentes partes (dominio, queries, etc) de la URL que está ejecutando la aplicación.
$_SERVER contiene información muy útil y en este array tenemos la llave HTTPS que nos informa si estamos bajo un entorno seguro. Es posible que si te encontraste en la situación de comprobar vía PHP si se navega en entorno seguro o no hayas pensado en el uso de $_SERVER, pero que no encontrases un valor útil en esta variable.
El problema que tenemos con $_SERVER[‘HTTPS’] es que sólo está definido cuando navegamos por un entorno seguro. Si estamos navegando por http://localhost/imprimir_server.php que tiene este código:
<?php print_r($_SERVER);
no encontraremos en el resultado ninguna llave HTTPS ni nada que nos indique si navegamos por HTTPS o no.
Para quien no entienda el código, lo único que hace es imprimir de forma legible (print_r) la variable $_SERVER. Puede encerrarse el print_r por el tag HTML pre para que el navegador pinte el contenido tal cual y no intente interpretar su interior y se vea todo identado (o si no, en el navegador ir a ver código fuente).
Por lo tanto, si queremos comprobar por PHP si navegamos a través de protocolo seguro o no utilizaríamos la siguiente condición:
<?php if (isset($_SERVER['HTTPS'])) { // Codigo a ejecutar si se navega bajo entorno seguro. } else { // Codigo a ejecutar si NO se navega bajo entorno seguro. }
IMPORTANTE:
Debemos utilizar la function isset que nos proporciona PHP. Es cierto que el siguiente código también funciona:
<?php if ($_SERVER['HTTPS']) { // Codigo a ejecutar si se navega bajo entorno seguro. } else { // Codigo a ejecutar si NO se navega bajo entorno seguro. }
Sin embargo, este segundo código generará una alerta (aunque no la veamos por pantalla) ya que si no estamos navegando por https, se está intentando acceder a la clave HTTPS de $_SERVER y no existe, por lo que es muy probable que en los logs del servidor quede ese error reflejado.
Puede parecer «una tontería», pero ya he visto crecer logs de sistema unos 2GB en menos de una hora debido a una programación poco formal en una web con alto grado de visitas. Nuestras aplicaciones web tienen que ser lo más eficientes posible y eso significa tener un especial cuidado en evitar, entre otras muchas cosas, una generación grotesca de líneas de log.
Cuando no debemos usar PHP para comprobar si accedemos por HTTPS
Aunque la extrema sencillez para comprobar si navegamos por entorno seguro o no puede ser una tentación, debemos utilizarlo cuando es necesario.
A lo largo de los años he visto unos cuantos ejemplos de cómo hacer las cosas mal y de cómo utilizar PHP para todo, cuando existen alternativas mejores. Sin duda, la gran tarea pendiente del programador de PHP es dejar de usar PHP para absolutamente todo, alzar la vista y ver que nuestra aplicación en PHP está en un entorno donde también tenemos otras herramientas.
Un par de ejemplos:
Forzar la navegación por HTTPS
Si quieres que tu aplicación web funcione siempre bajo HTTPS, es muy habitual crear una redirección para que aquellos que acceden desde HTTP sean redirigidos (conservando la URL en sí) al entorno seguro (HTTPS).
Pues bien, esto jamás se debería hacer en PHP para una aplicación web. Todas las aplicaciones web escritas en PHP están corriendo en un servidor web (Apache, Cherokee, etc). Estos servidores web ya proporcionan formas de realizar estas redirecciones (En Apache vía .htaccess gracias al archiconocido mod_rewrite). Así que, pudiendo hacer este tipo de redirección ANTES de que Apache (o el que sea) ejecute nuestra aplicación web ¿por qué hacerlo después?
Uso un framework o un CMS como base para mi aplicación
Si tu aplicación web no es una programación desde cero, si no que se apoya en un framework o en un CMS (que dicho sea de paso es muy buena idea), lo primero que se tiene que hacer es ver si nuestro framework o CMS tiene establecido una forma para saber si se navega desde protocolo seguro o no. De ser así, lo mejor es que utilicemos la vía que el framework o CMS nos indica, cuando más utilicemos el código que nos proporciona mejor.
Por hoy, nada más 😉
Poco más hay que decir, PHP nos proporciona una forma sencilla de saber si estamos o no bajo un entorno seguro y podemos utilizarlo, correctamente, cuando así lo necesitemos.
Y con este artículo inicio una serie de tips que iré publicando de vez en cuando. Se agruparán por la etiqueta tips y su finalidad será ir dejando constancia de «pequeños trucos» o referencias del lenguaje muy útiles, pero ya sea por desconocimiento o porque se utilizan muy poco, lo habitual es que nos olvidemos o simplemente ignoremos que están ahí.
Muy buen documento, aclare muchas dudas!!