Web 2.0 Tips

Icon

Consejos y trucos para el desarrollo y diseño de webs

Cuidado con $_SERVER['HTTP_REFERER']

Bueno escribo este tip PHP por que es algo con los que todos nos topamos alguna vez, la variable global $_SERVER nos trae una serie de valores utiles a la hora de conseguir información de la conexión o el cliente al que estamos conectados, puede decirnos a que dominio nos estan visitando, desde que ip, con que navegador y etc.

El tema es que hay un indice de este array que suele causar problemas la referencia desde donde viene el pedido o el “HTTP_REFERER”.

Algunos conocen la aún mas problematica variable global $HTTP_REFERER, que puede estar como que no, dependediendo de la versión de  PHP.

Primero y antes de que nada hay que tener en cuenta que no podemos usar esta variable para algo mas que no sea estadísticas, o en casos precesitos, como no servir la descarga de un archivo de una, sin haber pasado por su pagina de presentación o etc. Pero nunca la debemos usar para validaciones o como medida de seguridad ya que es altamente falsificable.

Pero sungamos que queremos saber si el visitante vino de Google, entoces podemos leer esta variable, el problema esta en que no siempre existe.

cuando uno hace:

$referer = $_SERVER['HTTP_REFERER'];

Puede encontrarse con un error de variable no definida o similar, esto es por que aunque es una variable global, no en todos los casos esta, si el servidor web no devuelve un referer, esta variable no devuelve false, 0 o null, sino que directamente no existe.

Para usar bien esta variable en realidad primero hay que ver si existe, y luego tomar el valor, asi que podemos hacer es:

$http_referer = isset($_SERVER['HTTP_REFERER'])?$_SERVER['HTTP_REFERER']:null;

De esta forma tendremos la varible $http_referer que nos devolvera null comportandose tambien como “false” en las comparaciones.

Cualquier problema puedes dejarlo en los comentarios. Espero que les sea útil.


Tips relacionados:

  1. Problemas con $_SERVER['SERVER_NAME'] y subdominios virtuales

Tip de PHP, Programación

Tags: , , , ,

4 Responses

  1. Daniel says:

    Como recomendarias entonces validar que el usuario al intentar acceder al sistema y escriba la url sea enviado en caso de no estar logeado a la pagina de login?, con algun condicional y un header? o existe otra funcion que permita realizar esa accion?

  2. Exos
    Twitter: exos
    says:

    No se si entiendo bien tu pregunta, un sistema que valide mediante el referer se considera muy inseguro, ya que es un header nada mas, muy facil de falsificar.

    Todo lo que sea tema de usuarios ingresados al sistema se maneja, en php, por medio de sessions, tenés una variable global llamada $_SESSION donde podes guardar data solo de ese login, en todo caso si al hacer que el usuario este logueado guardas algo asi:

    $_SESSION['USER_LOGGED'] = true;

    Para validar en un documento que si o si este logueado, o sino lo mandas a la pantalla de login, podés hacer algo parecido a esto:

    if (!isset($_SESSION['USER_LOGGED']) || !$_SESSION['USER_LOGGED']) {
    header (“Location: /login.php”);
    exit(0); // es muy importante terminar la ejecución.
    }

    // resto del script.

    Eso si, acordate que si usas sesiones, tenes que arrancar todos los scripts con la funcion session_start();, al no ser que el servidor este configurado para hacerlo automáticamente.

  3. behamin says:

    tengo un problema utilizo $_SERVER['HTTP_REFERER']
    para que una vez termine una accion determinada, vuelva a la pagina anterior, pero en IE8 se queada en un bucle infinito, casi como si hiciera recusividad. Que puedo estar haciendo mal, puedo dejarte el código.

    muchas gracias.

  4. Exos
    Twitter: exos
    says:

    Si podés pasar el codigo que quieras. Sobre el tema de volver hacia atras, si la variable $_SERVER['HTTP_REFERER'] no existe o queda vasia puede que estes haciendo un location a nada (que seria basicamente un refresh).

    Yo te recomendaria no usar $_SERVER['HTTP_REFERER'] y arreglar eso de otra forma, como por ejemplo usando $_SESSION, al entrar en una seccion:

    $_SESSION['lastsec'] = $_SERVER['REQUEST_URI'];

    una cosa asi.

Leave a Reply

Exos

Oscar J. Gentilezza Arenas (Exos) Programador y curioso en lo relacionado en la informatica, actualmente trabaja de programador web usando PHP y manteniendo servidores en GNU/Linux y FreeBSD

Web: http://blog.exodica.com.ar

Tips: 40

Recomendamos

Haste autor!

En web2.0-tips, cualquiera puede publicar un consejo, truco o articulo relacionado con el desarrollo y diseño web. Tu puedes registrarte y postear, aparte te quedas con el 80% de impresiones de adsense en tus publicaciones.

Lee mas aca!

Categoria

Haste fan

Web Analytics