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