Las caracteríticas de autentificación HTTP en PHP solo
están 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 será llamada de nuevo con las variables predefinidas
PHP_AUTH_USER, PHP_AUTH_PW, y
AUTH_TYPE asignadas con el nombre de usuario, la
contraseña y el tipo de autentificación
respectivamente_ Estas variables predefinidas se pueden encontrar en
las matrices $_SERVER y
$HTTP_SERVER_VARS_ Sólo
autentificación "Básica" está soportada en este
momento_ Consulte la función header() para
más información_
Nota sobre la versión PHP:
Las Autoglobales,
tales como $_SERVER, han estado
disponibles desde la versión de PHP 4_1_0_
$HTTP_SERVER_VARS ha estado disponible desde
PHP 3_
Un script de ejemplo que fuerce la autentificación del
cliente en una página sería como el siguiente:
Ejemplo 16_1_ Ejemplo de autentificación HTTP <?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW_Authenticate: Basic realm="My Realm"');
header('HTTP/1_0 401 Unauthorized');
echo 'Text to send if user hits Cancel button';
exit;
} else {
echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}_</p>";
echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password_</p>";
}
?> |
|
Nota de compatibilidad:
Por favor tener cuidado cuando esteis programando las lineas de
cabecera HTTP_ Para garantizar la máxima compatibilidad con todos
los clientes, la palabra clave "Basic" debe de ser
escrita con "B" mayúscula, la cadena de texto debe
estar incluida entre comillas dobles (no simples) y exactamente un
espacio debe preceder el código 401 en
la linea de cabecera HTTP/1_0 401
En vez de, sencillamente, mostrar PHP_AUTH_USER y
PHP_AUTH_PW, seguramente querais 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_
Vigilar 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_
En fecha de la versión PHP 4_3_0, 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
asignadas si algún tipo de autentificación externa ha
sido activada para la página en particular_ En este caso, la
variable REMOTE_USER puede ser usada para
identificar al usuario autentificado externamente_ Asi que se puedes
utilizar $_SERVER['REMOTE_USER']_
Configuration Note:
PHP usa la directiva AuthType para determinar si
una autentificación externa esta en uso_
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 16_2_ Ejemplo de autentificación HTTP forzando una
reentrada <?php
function authenticate() {
header('WWW_Authenticate: Basic realm="Test Authentication System"');
header('HTTP/1_0 401 Unauthorized');
echo "You must enter a valid login ID and password to access this resource\n";
exit;
}
if (!isset($_SERVER['PHP_AUTH_USER']) ||
($_POST['SeenBefore'] == 1 && $_POST['OldAuth'] == $_SERVER['PHP_AUTH_USER'])) {
authenticate();
}
else {
echo "<p>Welcome: {$_SERVER['PHP_AUTH_USER']}<br>";
echo "Old: {$_REQUEST['OldAuth']}";
echo "<form action='{$_SERVER['PHP_SELF']}' METHOD='POST'>\n";
echo "<input type='hidden' name='SeenBefore' value='1'>\n";
echo "<input type='hidden' name='OldAuth' value='{$_SERVER['PHP_AUTH_USER']}'>\n";
echo "<input type='submit' value='Re Authenticate'>\n";
echo "</form></p>\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 tener en cuenta que hasta la version de PHP 4_3_3, la
autentificación HTTP no funcionaba con el servidor IIS de
Microsoft y la versión CGI de PHP, debido a una
limitación de IIS_ Para que funcione a partir de PHP 4_3_3,
debeis de editar vuestra configuración sobre "Seguridad en
directorios" en IIS_ Pulsar en 'Editar" y elegir solamente "acceso
anonimo", todos los demas campos no se deben de elegir_
Otra limitación es, si estais usando el módulo de IIS
(ISAPI), que no podeis usar las variables
PHP_AUTH_*, en su lugar debeis utilizar la
variable HTTP_AUTHORIZATION_ Por ejemplo:
list($user, $pw) = explode(':',
base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6)));
Nota para IIS::
Para que la autentificación HTTP funcione con IIS, la
directiva de PHP cgi_rfc2616_headers debe
de tener el valor 0 (valor por defecto)_
Nota:
Si safe mode está
activado, el uid de el script es agregado a la cabecera
WWW_Authenticate