Autenticazione HTTP
Possiamo controllare l'accesso a una pagina in diversi modi: tramite i cookie,
in Windows con le SSL, in Linux tramite i permessi sulle cartelle e i file;
ma se usate come web server Apache, allora PHP è un modulo che permette
anche connessioni controllate con l'istruzione
int header (string string [, bool replace])
Gli argomenti sono parecchi e permettono di controllare
la data, le ultime modifiche, la cancellazione della cache di autenticazione,
ecc.
Il funzionamento è molto semplice: PHP controlla
se alcune variabili sono state impostate ($PHP_AUTH_USER
e $PHP_AUTH_PW);
se non sono presenti si può richiedere che vengano impostate, poi si
può stabilire solo il tipo d'autenticazione Basic (PHP_AUTH_TYPE).
<?php
// intenzionalmente inseriamo una data
// molto vecchia per impedire che la
// pagina venga salvata nella cache
// del proprio computer
Header ("Expires:
Mon, 11 Dec 1999 08:08:08 GMT");
Header ("Last-Modified:
" .gmdate("D, d M Y H:i:s"). " GMT");
Header ("Pragma:
no-cache");
// poi evitiamo che l'header inviato in
// precedenza non permetta un nuovo login
Header ('WWW-Authenticate:
Negoziate');
Header ('WWW-Authenticate:
NTLM', false);
if (!isset($PHP_AUTH_USER))
{
// password errata
echo "Accesso ad una area protetta ...<br>";
// PHP_AUTH_TYPE è
disponibile solo quella BASIC
Header ("WWW-Authenticate:
BASIC realm=\"Restricted Area\"", replace);
Header ("HTTP/1.0
401 Unauthorized");
echo "Inserire la password per accedere";
exit;
}
else
{
// viene controllata la password
// che abbiamo definto: casa
if ($PHP_AUTH_PW !="casa")
exit;
echo "$PHP_AUTH_USER:
la password [$PHP_AUTH_PW] è stata
accettata";
}
?>
|
L'esempio è già commentato, occorre solo osservare che la funzione
isset serve a controllare la presenza della variabile
nella cache.
Compatibilità dell'autenticazione HTTP? La lettura e scrittura
dei dati utente.
Avrete sicuramente compreso che questo codice funziona solo sotto Apache e
quando PHP è un suo modulo, cioè nei sistemi UNIX like; ma un
passaggio è stato volutamente sottratto: dove sono memorizzate tutte
le UID e PWD degli utenti?
PHP non prevede questo o, meglio, bisogna gestirle creando un database, esattamente
come si farebbe in ASP o JSP.
MySQL per esempio, oppure un semplice file ASCII in lettura/scrittura utilizzando
le funzioni del tutto C like che permettono di scrivervi
dio_open --
Open a new filename with specified permissions of flags and creation permissions
of mode
dio_read --
Read n bytes from fd and return them, if n is not specified, read 1k
dio_write --
Write data to fd with optional truncation at length
dio_truncate -- Truncate file descriptor
fd TO offset bytes
dio_stat --
Get stat information about the file descriptor fd
dio_seek --
Seek TO pos on fd from whence
dio_fcntl --
Perform a c library fcntl on fd
dio_close --
Close the file descriptor given by fd
Queste sono funzioni da usare con cautela, non tanto per gli errori che si
potrebbero commettere in fase di lettura/scrittura, ma per l'uso che ne potrebbe
fare un hacker sapendo che sono state implementate, e per il fatto che dovremmo
usare una cartella isolata dalla WWWRoot con permesso di lettura/scrittura/modifica
per tutti gli utenti (EveryOne). Allora non rimane che usare un database come
MySQL o PostgreSQL. Ma una cosa qui non funziona proprio: la inutile ridondanza
del codice.
Il pregio del PHP sta tutto nella sua portabilità; se ci priviamo di
questa, è meglio utilizzare il il linguaggio di cui nativamanete il
server dispone: ASP è di gran di lunga più accettabile su IIS
se non ci si pone il problema della portabilità!
- Usare le variabili di sessione per stabilire un contatto col client e
per mantenerne lo stato
- usare un database come MySQL per inserire/modificare i dati utenti
- usare il metodo POST per legare le pagine
Più semplice di così!
Precisazioni sull'installazione di MySQL sotto Windows 2000 Server
Se l'installazione del servizio dovesse fare le bizze in quest'ambiente, a
causa della vostra versione non proprio compatibile con esso, potete sempre
avviare l'utility winmysqladmin.exe nella directory
c:\mysql\bin e verificare che il servizio sia
veramente presente nei servizi standard sia digitando dal Command
Prompt NET START sia usando Administrative
Tools\Services.
Scarica gli esempi allegati
Attenzione: gli esempi qui mostrati funzionano con copia e incolla
a patto che vengano tolti tutti i caratteri superflui (colore, spaziatura,
...) utili per una migliore visualizzazione sui browser, ma fastidiosi per
il parser PHP!
Pagina precedente -
Pagina successiva