Las caracteríticas de autentificación HTTP en PHP solo estan
disponibles cuando se está ejecutando como un módulo en
Apache y hasta ahora no lo estan en la versión CGI. En un script PHP
como módulo de Apache, se puede usar la función
Header() para enviar un mensaje de "Autentificación 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 autentificación respectivamente. Sólo
autentificación "Básica"esta soportada en este momento.
Consulte la función Header() para más información.
Un fragmento de script de ejmplo que fuerce la autentificación del cliente
en una página sería como el siguiente:
Ejemplo de autentificación HTTP
<?php
if(!isset($PHP_AUTH_USER)) {
Header("WWW-Autentificación: Basic realm=\"Mi Reino\"");
Header("HTTP/1.0 401 No autorizado");
echo "Texto a enviar si pulsa el botón 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 aquí los navegadores Interner Explorer con bugs. Parecen muy quisquillosos
con el orden de las cabeceras. Enviar la
cabecera WWW-Autentificación 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 página que ha sido autentificada a través de
algún mecanismo externo tradicional, las variables PHP_AUTH no serán
rellenadas si algún tipo de autentificación externo
ha sido activado para una página 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 borrarán la caché de la
ventana de autentificación en el navegador local después 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 botón de
"desconectar".
Ejemplo de autentificación HTTP forzando una reentrada
<?php
function authenticate() {
Header( "WWW-Autentificación: reino básico=’Test Autentificación
Sistema ’");
Header( "HTTP/1.0 401 No autorizado");
echo "Debe introducir un nombre de usuario y contraseña válidos
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 estándar de autentificación
básica de HTTP, por lo que nunca debe depender
de esto. Pruebas con Lynx han demostrado que Lynx no borra las credenciales
de autentificación con una respuesta 401 del
servidor, por lo que pulsando atrás y después adelante abriría
el recurso de nuevo (siempre que los requerimientos de
contraseña no hayan cambiado).
Además note que esto no funciona usando el servidor IIS de Microsoft
y la versión CGI de PHP debido a una limitación
del IIS
|
Anterior: crear gif php |
Siguiente: enviar archivos con php |
| articulos relacionados |