gratiszona

Autentificacion HTTP con PHP

Las caracteriticas de autentificacion HTTP en PHP solo estan disponibles cuando se esta ejecutando como un modulo en
Apache y hasta ahora no lo estan en la version CGI. En un script PHP como modulo de Apache, se puede usar la funcion
Header() para enviar un mensaje de "Autentificacion requerida"al navegador cliente haciendo que muestre una ventana de
entrada emergente con nombre de usuario y contraseña. Una vez que el usuario ha rellenado el nombre y la contraseña, la
URL que contiene el script PHP vuelve a ser llamada con las variables $PHP_AUTH_USER, $PHP_AUTH_PW y
$PHP_AUTH_TYPE rellenas con el nombre de usuario, la contraseña y el tipo de autentificacion respectivamente. Solo
autentificacion "Basica"esta soportada en este momento. Consulte la funcion Header() para mas informacion.
Un fragmento de script de ejmplo que fuerce la autentificacion del cliente en una pagina seria como el siguiente:
Ejemplo de autentificacion HTTP
<?php
if(!isset($PHP_AUTH_USER)) {
Header("WWW-Autentificacion: Basic realm=\"Mi Reino\"");
Header("HTTP/1.0 401 No autorizado");
echo "Texto a enviar si pulsa el boton Cancelar\n";
exit;
} else {
echo "Hola $PHP_AUTH_USER.<P>";
echo "Ha introducido $PHP_AUTH_PW como su contraseña.<P>";
}
?>

En vez de, sencillamente, mostrar $PHP_AUTH_USER y $PHP_AUTH_PW, seguramente quiera comprobar la validez del
nombre de usuario y la contraseña. Tal vez enviando una consulta a una base de datos o buscando el usuario en un fichero
dbm.
Vigile aqui los navegadores Interner Explorer con bugs. Parecen muy quisquillosos con el orden de las cabeceras. Enviar la
cabecera WWW-Autentificacion antes que la cabecera HTTP/1.0 401 parece ser el truco por ahora.
Para prevenir que alguien escriba un script que revele la contraseña de una pagina que ha sido autentificada a traves de
algun mecanismo externo tradicional, las variables PHP_AUTH no seran rellenadas si algun tipo de autentificacion externo
ha sido activado para una pagina en particular. En este caso, la variable $REMOTE_USER puede ser usada para identificar
al usuario autentificado externamente.
Nota, a pesar de todo, lo ya dicho no proteje de que alguien que controle una URL no autentificada robe contraseñas de
URLs autentificadas en el mismo servidor.
Tanto Netscape como Internet Explorer borraran la cache de la ventana de autentificacion en el navegador local despues de
recibir una respuesta 401 del servidor. Esto puede usarse, de forma efectiva, para "desconectar"a un usuario, forzandole a
reintroducir su nombre y contraseña. Algunas personas usan esto para "hacer caducar"entradas, o para proveer un boton de
"desconectar".
Ejemplo de autentificacion HTTP forzando una reentrada
<?php
function authenticate() {
Header("WWW-Autentificacion: reino basico=’Test Autentificacion Sistema ’");
Header("HTTP/1.0 401 No autorizado");
echo "Debe introducir un nombre de usuario y contraseña validos para acceder a
este recurso\n";
exit;
}
if(!isset($PHP_AUTH_USER) || ($SeenBefore == 1 && !str-cmp($
OldAuth, $PHP_AUTH_USER)) ) {
authenticate();
}
else {
echo "Bienvenido: $PHP_AUTH_USER<BR>";
echo "Old: $OldAuth";
echo "<FORM ACTION=\"$PHP_SELF\" METHOD=POST>\n";
echo "<INPUT TYPE=HIDDEN NAME=\"SeenBefore\" VALUE=\"1\">\n";
echo "<INPUT TYPE=HIDDEN NAME=\"OldAuth\" VALUE=\"$PHP_AUTH_USER\">\n";
echo "<INPUT TYPE=Submit VALUE=\"Re Authenticate\">\n";
echo "</FORM>\n";
}
?>

Este comportamiento no es requerido por el estandar de autentificacion basica de HTTP, por lo que nunca debe depender
de esto. Pruebas con Lynx han demostrado que Lynx no borra las credenciales de autentificacion con una respuesta 401 del
servidor, por lo que pulsando atras y despues adelante abriria el recurso de nuevo (siempre que los requerimientos de
contraseña no hayan cambiado).
ademas note que esto no funciona usando el servidor IIS de Microsoft y la version CGI de PHP debido a una limitacion
del IIS
Anterior: crear gif php
Siguiente: enviar archivos con php