¿Cómo enviar las variables en PHP?

Resumen.

Como ya dijimos antes, las variables son como “cajas o paquetes” en las que guardamos información. Pues bien, en este capitulo veremos como podemos asignar valores a las variables y como enviar estas variables de una página a otra de nuestro sitio Web. Como se puede imaginar, las importancia de este capitulo es máxima, y está detrás de cualquier formulario, de cualquier búsqueda o cualquier sistema de identificación.

Artículo.

Como ya dijimos anteriormente, las variables son como paquetes que contienen datos. Pues bien, esos datos deben poderse mover entre las páginas que forman el sitio Web, y para eso tenemos diferentes métodos que se adecuarán a cada caso.

En PHP tenemos cuatro formas de enviar los datos entre las diferentes páginas del sitio Web, y entre estos cuatro métodos cabría establecer una diferenciación sutil, pero muy importante.

Los métodos POST y GET envían variables de una página a otra (de página A a página B), por lo que podríamos decir que son métodos de envío propiamente dichos. Ahora bien, los métodos COOKIE Y SESSION hacen disponible el valor de la variable en cualquier página del sitio Web donde estos valores podrán ser usados o no. Por ello podemos decir que COOKIE y SESSION son mas unos métodos de propagación de variables que de envío propiamente dichos.

Cabe mencionar, aunque solo lo haremos de pasada, el método $_REQUEST, que es un método de recepción de variables válido para los métodos GET, POST y COOKIE. Su potencialidad, es su gran debilidad, cuando se usa, es preciso tener un buen motivo para ello, y por supuesto, la validación de los datos debe ser escrupulosa.

El método GET.- Este método consiste básicamente en enviar el valor de una variable a través de la URL, por lo que el valor de la variable se hace visible e incluso puede ser rastreado por los motores de búsqueda. Por tales motivos, los datos que podemos pasar usando este método deben ser datos neutrales en lo que a seguridad se refiere. ¿Qué queremos decir con esto?

Cuando pasamos por el URL el título de un artículo, como es el caso de la URL de esta misma página, el valor de la variable no tiene relevancia alguna en lo que a la seguridad se refiere. Ahora bien, imagina que pasas por URL una dirección de e-mail, la cosa se hace más delicada y esa cuenta podría ser víctima de spam. Pero la cosa puede ser un grave problema si se pasan por este método datos como la numeración de una tarjeta de crédito o no digamos, una clave de acceso.

Por supuesto podemos tomar medidas como codificar el valor de la variable usando por ejemplo la función base64_encode(), y su complementaria, base64_decode(), para decodificar el valor codificado, pero este método no es seguro. Para un profano en programación, vería ese valor codificado en la URL, y sencillamente, no vería ningún valor en él, pero un programador sí que podría ver un valor, y no solo eso, usar la función de descodificación para ver el valor original, con todo lo que esto puede suponer. El método GET también es usado profusamente en los formularios de búsqueda. Es absolutamente imprescindible que los datos enviados por este método tengan una validación fuerte (esto lo trataremos en el artículo dedicado a la validación de datos) para prevenir vulnerabilidades, como el ataque de inyección por URL, una técnica de hackeo ampliamente usada, de hecho, expertos en seguridad informática atribuyen a este método mas del 90% de los ataques.

La sintaxis de envío de valores por el método GET tiene dos formas, la más sencilla mediante un enlace:


pagina_destino.php?nombre=Perico


y si queremos enviar mas de una variable usamos el concatenador &:


pagina_destino.php?nombre=Perico&ciudad=Sevilla&cp=41069


La segunda forma de envío de variables por el método GET es a través de un formulario, como ocurre con los formularios de búsqueda.


<form method="GET" action="buscador.php">
<input type="search" name="busca">
<input type="submit" value="Buscar">
</form>


Para el envío de las variables, como podemos ver, no es preciso código PHP, pero sí lo es para la recepción de estas.


<?php
$variables = $_GET; // Las recibimos todas juntas
// Las recibimos una a una
$nombre = $_GET['nombre'];
$ciudad = $_GET['ciudad'];
$codigo_postal = $_GET['cp'];
$buscamos = $_GET['busca'];

echo '<pre>';
print_r($variables);
echo '</pre>';

echo "$nombre <br />
$ciudad <br />
$codigo_postal <br />
$buscamos";
?>


Si recordáis del capítulo dedicado a las variables tipo array, hicimos mucho hincapié en la importancia de estos, pues bien, como podéis observar, aquí esta el primero que formará parte permanente de nuestra rutina.

Como último detalle, añadir que el método GET no permite el envío de más de 2048 caracteres.

El método POST.- Este método es el que habitualmente se usa en los formularios de contacto, registro, identificación, etc. A diferencia del método GET, este método de envío de datos no los desvela, es el método adecuado para enviar datos que si pueden comprometer la seguridad, como NIF, cuentas bancarias, números de tarjetas de crédito, claves, etc.

El envío de datos mediante este método, si bien es mas seguro que el método GET, no lo es mucho más, y si no hay una validación adecuada de datos podemos sufrir ataques de inyección SQL. Esta técnica de hackeo es la misma que la inyección por URL, la diferencia estriba en que mientras en la segunda se pueden introducir los datos directamente en la URL, en esta, los datos tienen que pasar a través de un formulario, lo cual puede precisar saltarse la validación del lado del navegador (validación HTML o javascript), y desde luego resulta menos cómodo para el atacante, aunque puede ser igual de efectivo si no se ha efectuado una validación adecuada.

Para enviar datos, al igual que con el método GET, no es preciso código PHP, basta con un simple formulario HTML.


<form method="POST" action="login.php" >
<input type="text" name="usuario"><br />
<input type="password" name="clave"><br />
<input type="submit" value="Entrar" />
</form>


La recepción de los datos en el método POST si precisa código PHP, y es casi idéntica a la del método GET.


<?php
$variables = $_POST; // Las recibimos todas juntas
// Las recibimos una a una
$usuario = $_POST['usuario'];
$clave = $_POST['clave'];

echo '<pre>';
print_r($variables);
echo '</pre>';

echo "$usuario <br />
$clave";
?>


Las cookies.- En términos estrictos, no es un método de envío de datos en cuanto tal, pero sí te permite almacenar un valor de variable para poder usarlo en cualquier página de un sitio Web.

Pero, ¿qué es una cookie?

Las cookies son archivos que se pueden crear con PHP (y otros lenguajes), que almacenan un valor de variable y lo guardan en el dispositivo de acceso del usuario, ordenador, smarphone, etc. A este archivo se puede acceder desde cualquier página del sitio Web y recuperar el valor de esa variable en un momento posterior, que puede ser desde unos segundos, hasta horas, días, meses o incluso años.

Esto se hace normalmente sin que el usuario tenga conocimiento alguno, aunque ahora la ley nos obligue a informar del uso de cookies y el usuario tenga que dar conformidad para ello, pero esto no es ya una cuestión de programación, es una cuestión de legislación.

Las cookies tienen muchos usos, desde aquellas que almacenan nuestras intenciones de compras en una tienda online, pasando por las que se usan para medir el tráfico de un sitio Web o aquellas que nos permiten mantenernos identificados en un sitio Web. No son estos los únicos usos, pero probablemente son los más frecuentes y conocidos.

Dicho esto, vamos ahora a ver cómo podemos crear una cookie en PHP. Su sintaxis es muy sencilla.


<?php

/* setcookie('nombre cookie', 'valor cookie', caducidad, 'directorios', '.midominio.com');
La caducidad de la cookie se expresa en segundos a partir del momento actual */

setcookie('cok_nombre', 'Juan Peréz', time() + (60 * 60), '/');

?>


Como estamos viendo la función setcookie() recibe cuatro parámetros. El primero es el nombre de la cookie que, por decirlo de alguna manera, es como el nombre del campo de un formulario y nos permitirá recoger su valor. El segundo parámetro es el valor que toma esa variable cookie.

El tercero usa una función no paramétrica de PHP, time(), que nos permite identificar el momento actual en segundos, el momento de la creación de la cookie, a este valor es preciso sumarle el número de segundos que durará la cookie, que en el caso ejemplificado (60 * 60) estamos estableciendo una duración de una hora, 60 segundos * 60 minutos, son los 3600 segundos que tiene una hora. Podemos expresarlo así, a mí me resulta mas cómodo, o también como time() + 3600. Esta cookie, por tanto, dejará de tener valor en el plazo de una hora. Si quisiéramos que la cookie durase un mes seria (60 * 60 *24 * 30). Nos basta con agregar, 24, ya que un día tiene 24 horas y 30 días aproximadamente tiene un mes.

En el cuarto parámetro '/' especificamos que la cookie será recuperable desde cualquier parte del dominio, si quisiéramos que solo se pudiera recuperar desde un directorio concreto especificaríamos su nombre '/mi_directorio'. También podríamos especificar un quinto parámetro, el nombre de dominio, que nos permitirá delimitar si una cookie puede ser recuperada desde el dominio principal y solo desde este, o desde él y todos sus subdominios o solo desde subdominios concretos. Pero no solo esto, también podemos especificar mas parámetros, como por ejemplo si la cookie puede ser compatible con modos seguros, https. Dado que solo estamos presentando las cookies, si desea mas información, consulte la página oficial.

Como puede observarse, a diferencia de los métodos anteriores para crear una cookie es preciso usar código PHP, y además este debe estar antes de cualquier código HTML que pueda contener la página, salvo, claro está, el código incrustado en PHP.

Para recuperar una cookie el código que usaremos será:


<?php
$todas_las_cookies = $_COOKIE;
// Una cookie concreta
$cok_nombre = $_COOKIE['cok_nombre'];

echo $cok_nombre;
?>


Cabe agregar que las cookies pueden ser eliminadas, bueno, más bien caducadas. La solución es sencilla, crear una nueva cookie con el mismo nombre, pero ya caducada, basta con restar un segundo al momento actual.


<?php

/* setcookie('nombre cookie', 'valor cookie', caducidad, 'directorios', '.midominio.com');
La caducidad de la cookie se expresa en segundos a partir del momento actual */

setcookie('cok_nombre', 'Juan Peréz', time() - 1 '/');

?>


Como podemos ver, la sintaxis es muy similar a los métodos GET y POST, y de igual manera podemos recibir el array que las contiene todas, o bien las podemos recuperar de una en una por su nombre.

Las sesiones.- Hemos dejado las sesiones para el último lugar porque consideramos que es el mejor momento para comprenderlas. Las sesiones son como las cookies, salvo porque se ejecutan en el servidor. Otra diferencia es su duración, no duran más de una o dos horas, y su caducidad, ya que según cierras el navegador, la sesión caduca. Y si hay algo por lo que destacan las sesiones, es por su seguridad. Las cookies pueden ser robadas, las sesiones, nunca.

Para poder declarar (crear) una variable de sesión primero debemos indicar en la página que vamos a usar sesiones, esto lo haremos mediante session_start(); que debe situarse siempre en la primera línea de la página, nunca después de cualquier tipo de código, sea PHP, HTML…


<?php session_start();

// Creamos variables de sesión
$_SESSION['nombre'] = 'Antonio';
$_SESSION['clave'] = 'abc123';

?>


Para recuperar las sesiones debemos volver a indicar que estamos trabajando con sesiones y lo haremos de la siguiente forma:


<?php session_start();

// Recuperamos todas las variables de sesión
$sesiones = $_SESSION;

// Recuperamos variables de sesión concretas
$nombre = $_SESSION['nombre'];
$clave = $_SESSION['clave'];

?>


Si bien las cookies las hacíamos caducar, las sesiones pueden ser eliminadas, esto lo haremos de la siguiente manera:


<?php session_start();

// Así eliminamos sesión concreta
unset($_SESSION['clave']);

?>


Indicar que la función unset() no solo elimina sesiones, también elimina cualquier variable unset($nombre).

Si lo que queremos es eliminar todas las sesiones lo haremos de la siguiente manera:


<?php session_start();

// Así eliminamos TODAS las variables de sesión.
session_destroy();
?>


Otra particularidad que tienen las variables de sesión es que si bien los métodos GET, POST y COOKIE solo permiten el envío o propagación de variables simples, el método SESSION permite la propagación de variables tipo ARRAY, diferencia que puede no parecer muy significativa, pero que si que lo es.

Por último, agregar que dada la naturaleza de las sesiones su importancia es extrema. Las sesiones están en el núcleo esencial de cualquier sistema de logeo seguro, por lo que comprender su uso y lógica de funcionamiento, es esencial.
Tags: POST || GET || COOKIES || SESSION

Comentarios.

Sin comentarios, publica el tuyo.