PHP para desarrollo de aplicaciones web (II)
La autenticación de usuarios utilizando HTTP
El protocolo HTTP proporciona un mecanismo de autenticación de clientes. Para ello hay que utilizar la cabecera de los
paquetes HTTP e incluir en ellos que enviamos un paquete de autenticación. Este paquete, una vez recibido en el cliente,
provocará que este obtenga de alguna forma un login y una clave del navegante. Lo más común es que se presente una cajita
con dos campos: uno para introducir el login y el otro para introducir la clave. Este login y clave son enviados al servidor, el
cual verificará los permisos de este usuario a través de algún sistema: bases de datos, LDAP etc.
PHP tiene una función llamada header() que permite trabajar con la cabecera de los paquetes HTTP. Es fundamental no
escribir nada de código HTML antes de utilizar estas funciones, ya que en caso contrario, no sería posible modificar la
cabecera del paquete HTTP y al llamada a la función header provocaría un error.
Si queremos enviar al usuario una petición de autenticación lo que hay que hacer es incluir al comienzo de la página el siguiente
código:
if(!isset($PHP_AUTH_USER)) {
Header("WWW-Authenticate: Basic realm=\"Zona protegida\"");
Header("HTTP/1.0 401 Unauthorized");
echo "Texto que se envía si el usuarios pulsa en botón Cancel\n";
exit;
} else {
echo "Hola $PHP_AUTH_USER.
";
echo "Has introducido $PHP_AUTH_PW como tu clave.
";
}
En este sencillo ejemplo, tomado directamente del manual de PHP, lo único que se hace es presentar el login y clave
introducidos por el usuario. Lo normal es que se compruebe este login y clave en una base de datos, a través de las potentes
funciones de PHP, o en un servidor de LDAP o la misma base de datos de usuarios del sistema.
Una vez que el usuario se ha autenticado el cliente, estos datos se envían en todas las peticiones de páginas para esa zona
protegida, por lo que en todo momento podemos saber quien está accediendo a las páginas. Es una especie de cookie que se
mantiene mientras el usuario no apague el navegador o reciba un paquete de autenticación invalida. Con este sistema podemos
tener una zona protegida en la que se hace un control exhaustivo de quien ha accedido a la página, a que hora, que otras
páginas ha visitado de la zona protegida etc. El usuario es consciente que desde el momento que ha insertado su login y clave
ha sido identificado, y que todo lo que haga puede ser registrado.
El problema con las cookies es que el usuario no es muchas veces consciente de este hecho, y el día que lo entiende, se vuelve
un navegante paranoico más que cree que en todos los sitios le están controlando.
Subida de ficheros utilizando HTTP
Uno de los servicios favoritos de todos los internautas es el intercambio de información. Y este suele ir asociado al intercambio
de ficheros en un 99% de los casos. Muchas veces cuando montamos un servicio en Internet, necesitamos que el usuario
pueda enviar sus ficheros al servidor: páginas web, imágenes, sonido, etc.
Como todos sabemos la solución ideal para el intercambio de ficheros es el FTP. Pero lo que los internautas están
acostumbrados a utilizar es el web. Para que utilicen el FTP hay que indicarles un cliente, el navegador podría ser pero su
interfaz es compleja para hacer FTP. Una vez que tienen el cliente hay que configurarlo. Y luego tienen que aprender a utilizar
el programa. En muchos casos esto sólo supone la pérdida de un par de horas pero en otros, se vuelve algo complicado de
lograr si el internauta no está muy formado en temas de Internet.
HTTP nos proporciona una solución ideal para simplificar este envío de ficheros desde el cliente hacia el servidor, sin salirse de
la interfaz web en ningún momento. Es lo que se conoce como HTTP Upload. Con este mecanismo podemos lograr que el
cliente nos envíe ficheros locales de su computador pulsando un botón.
Lo primero es crear una página HTML con un formulario en el que incluimos el widget.
<FORM ENCTYPE="multipart/form-data" ACTION="recibe_fichero.php3" METHOD=POST>
<INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="1000">
Envía este fichero: <INPUT NAME="fichero_usuario" TYPE="file">
<INPUT TYPE="submit" VALUE="Envía Fichero">
</FORM>
Destacar de este formulario HTML la posibilidad de restringir el tamaño del fichero que se va a enviar. El protocolo HTTP no
es tan robusto como FTP para el intercambio de ficheros grandes, por lo que este sistema es muy recomendable con ficheros
de cientos de kilo-bytes.
La página HTML resultante es, una vez que el usuario ha pulsado el botón de seleccionar el fichero la que se observa en la
siguiente figura.
Este fichero se envía al servidor de web el cual lo reenvía al cgi que se encarga de su tratamiento, en este caso el programa
PHP "recibe_fichero.php3". Este programa PHP se encarga de ir recibiendo el fichero y almacenarlo en un directorio del disco
duro. Es importante tener en cuenta que el usuario que está guardando el fichero es aquel con el que se ejecuta el servidor de
web por lo que deberá de tener permisos para escribir en el directorio y fichero que se utilicen.
Dentro del programa de PHP que recibe este fichero se definen una serie de variables que nos vana a permitir gestionar el
fichero recibido:
- $fichero_usuario: nombre del fichero temporal en el que se ha almacendo en el servidor el fichero enviado por el
usuario. El lugar donde se guardan estos ficheros es el directorio temporal del servidor de web.
- $fichero_usuario_name: nombre original del fichero tal y como nos lo envió el usuario
- $fichero_usuario_size: tamaño del fichero
- $fichero_usuario_type: el tipo MIME con el que el navegador a identificado el fichero
Con estos datos es sencillo localizar los ficheros que nos envían los clientes y colocarlos en los directorios adecuados.
Podemos incluso colocarlos en unos directorios u otros según la identidad del usuario que los envíe.
En principio este servicio se puede abrir de forma anónima, con lo que tendríamos algo muy similar a un servidor de FTP
anónimo. Pero nada nos impide proteger las páginas de subida de ficheros y poder identificar al usuario que los envía. En este
caso ya tenemos un servicio similar a un FTP autenticado.
El proporcionar la opción de subir los ficheros por el web a un cliente puede ser la frontera entre que nos lo envíe o no. En un
mundo de portales, con cientos de servicios gratuitos, si queremos tener la esperanza de que nuestros usuarios nos envíen sus
fotografías, la de los productos que meten en su tienda gratuita etc. las posibilidades de que lo logremos serán mucho más altas
con este tipo de mecanismos que utilizando el protocolo FTP clásico. Y siempre se pueden dejar ambas opciones, para que
los usuarios más avanzados tengan la potencia y flexibilidad de intercambiar sus ficheros con FTP.
Conclusiones
Las funcionalidades presentadas en este artículo son básicas a la hora de crear páginas dinámicas utilizando PHP. Su dominio
y su integración dentro de proyectos de Internet debe ser un objetivo dentro de la comunidad de desarrolladores PHP.
Son tecnologías muy potentes, aunque sólo constituyen la punta de todo lo que se puede hacer con el lenguaje PHP. En las
próximas entregas de esta sección seguiremos presentando nuevas funciones de las amplísimas librerías de PHP, y
comenzaremos a profundizar en PHP4, el producto estrella para el desarrollo de Internet de los próximos meses.
Referencias