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