Sei sulla pagina 1di 10

Login e Cookie

In una precedente dispensa, reperibile allurl http://www.scribd.com/cinziabb/d/83483496Invio-di-dati-al-server-e-gestione-con-PHP abbiamo visto come creare un form HTML per il login di un utente a un sito e come gestire questi dati lato server, con il linguaggio PHP. Il form prevedeva solo due campi per linserimento di username e password e il pulsante submit per linvio dei dati al server. Normalmente, un form per il login contiene qualche controllo in pi, come: un link da utilizzare nel caso in cui si sia dimenticata la password; un link da utilizzare per effettuare la registrazione; una casella di controllo da utilizzare se si desidera essere identificati ogni volta che si torna a visitare il sito. Lesempio che vi propongo realizza un form pi completo e vi consente di comprendere come gestire con PHP non solo i dati provenienti da campi testo/password ma anche da selezioni di caselle di controllo (checkbox). Ci occuperemo, inoltre, dellinvio di cookie al client.

Login : creazione del form HTML


Di seguito riportato il codice HTML, contenuto nel file login.php, che crea il form.
login.php

<form id="login-form" name="login-form" method="post" action="login.php"> <label for="username">Username</label> <input id="username" name="username" type="text"><br><br> <label for="password">Password</label> <input id="password" name="password" type="password"><br><br> <a href="#">Hai dimenticato la password?</a><br><br> <input id="remember" name="remember" value="remember" type="checkbox"> <label for="remember">Ricordami</label> <input id="login-button" type="submit" value="Login"><br><br> <a href="#">Sei un nuovo utente? Registrati</a> </form>

Il form appare come nella seguente figura.

1
Bocchi Cinzia Ultimo aggiornamento: 10/03/2012

Sappiamo che quando lutente fa clic sul pulsante Login, lo username e la password vengono inviati al server per lelaborazione ma non abbiamo ancora visto come viene passato il contenuto di una checkbox e dove possiamo reperirlo sul server. Apro, quindi, una piccola parentesi per mostrarvi come gestire i dati provenienti dalla selezione di checkbox e radiobutton.

Invio di dati con checkbox


Consideriamo il form seguente:
<form method =post action=checkbox.php> Ti piace il genere: <br/> <input type="checkbox" name="opzione1" value="comico" checked/> comico <br/> <input type="checkbox" name="opzione2" value="horror"/> horror <br/> <input type="checkbox" name="opzione3" value="drammatico"/> drammatico <br/> <input type="submit" value="Invia Preferenze" /> </form>

Potete determinare quale casella di controllo lutente ha selezionato, testando quale/quali elementi dellarray $_POST sono stati impostati. Per ogni casella selezionata dallutente, il contenuto del suo campo value sar trasferito nellarray opportuno. Di conseguenza, supponendo che lutente scelga la casella di controllo comico, la situazione sar la seguente: $_POST[opzione1] = comico $_POST[opzione2] non impostato $_POST[opzione3] non impostato Per controllare se un elemento dellarray stato impostato, si usa la funzione PHP isset. Lo script seguente produce a video le checkbox selezionate.
<html> <head> <title>Checkbox.php</title> </head> <body> <p> Hai scelto le seguenti opzioni: </p> <br/> <?php if (isset($_POST["opzione1"])) echo $_POST["opzione1"]."<br/>"; if (isset($_POST ["opzione2"]))

2
Bocchi Cinzia Ultimo aggiornamento: 10/03/2012

echo $_ POST ["opzione2"]."<br/>"; if (isset($_POST ["opzione3"])) echo $_ POST ["opzione3"]; ?> </body> </html>

Invio di dati con radiobutton


Consideriamo il seguente form:
<form method="post" action="radiobutton.php"> Ti piace studiare? <br/> <input type="radio" name="domanda" value="si" checked/> SI <br/> <input type="radio" name="domanda" value="no"/> NO <br/> <input type="radio" name="domanda" value="non so"/> NON SO <input type="submit" value="Invia Preferenza" /> </form>

Potete determinare nel codice PHP quale pulsante radio lutente ha selezionato, testando il contenuto di $_POST[domanda]. Per esempio, il seguente script PHP produce a video il pulsante selezionato.
<html> <head> <title>Radiobutton.php</title> </head> <body> <p> Hai scelto la seguente opzione: </p> <br/> <?php echo $_POST["domanda"]."<br/>"; ?> </body> </html>

In questo caso siamo sicuri che almeno un radiobutton selezionato perch il primo pulsante radio selezionato di default e possiamo fare a meno di utilizzare isset(). In caso contrario necessario ricorrere alluso di isset per verificare se lutente ha effettuato una selezione.

3
Bocchi Cinzia Ultimo aggiornamento: 10/03/2012

Ricordare lutente con I cookie


I cookie sono informazioni che il server salva sul computer dellutente; ogni volta che lutente accede al sito, le informazioni contenute nei cookie vengono rilette e aggiornate. I cookie si rivelano molto utili ma possono presentare alcune criticit ed per questo che devono essere abilitati esplicitamente dallutente. Se da un lato il cookie rappresenta un utile strumento per il webmaster, dall'altro pu essere utilizzato con intenzioni malevole: in questo caso diventa un potente strumento per spiare l'utente. Con le "giuste impostazioni" all'interno del cookie, infatti, possibile tracciare tutto quanto possa definire un "modello di comportamento" : date, orari, pagine visitate, contenuti richiamati e relativi genere e frequenza di visualizzazione. Analizzando tutte queste informazioni con procedure di data mining, il titolare del cookie pu stabilire quali sono le abitudini e le preferenze di chi utilizza il browser: in questo modo diventa possibile proporre annunci pubblicitari in modello mirato: ad esempio, se il cookie rivela che il browser visita spesso pagine dedicate allo sport, all'utente verranno proposti banner pubblicitari che rimandano a rivenditori di articoli sportivi. [...] Peggio ancora, un criminale informatico potrebbe predisporre una pagina web appositamente per installare un "cookie tracciante" sul computer dei malcapitati visitatori e sfruttare le informazioni ottenute per preparare attacchi di altro tipo, ben pi pericolosi. Ovviamente, difendersi da queste insidie possibile : l'opzione pi semplice consiste nel disabilitare l'utilizzo dei cookie nel proprio browser. Sfortunatamente questa anche la scelta pi drastica, in quanto alcune pagine richiedono espressamente di salvare le impostazioni sul nostro computer, pena un degrado delle funzionalit. Un esempio la funzione "ricordami su questo computer" che ci viene messa a disposizione quando accediamo ad un forum (anche quello di PC-Facile ne fa uso) o ad una casella di Web Mail: in questo caso, l'impostazione del login viene registrata in un cookie, in modo che l'utente, alla visita successiva, possa accedere direttamente alla propria pagina personale anzich essere costretto a fare login. Fonte: http://www.pc-facile.com/glossario/cookie/ Ecco alcuni casi nei quali mantenere traccia del navigatore diventa una necessit: Personalizzazione. Quando si vogliono personalizzare le esperienze dei visitatori in base alle pagine che hanno gi visitato (es. banner pubblicitari). Mantenimento della sessione. Se desideriamo evitare che l'utente, quando si muove all'interno di un'area riservata, sia costretto a ripetere il login ad ogni pagina. Il protocollo HTTP, infatti, stateless, cio n il server n il client mantengono informazioni relative ai messaggi precedentemente scambiati. Ne consegue che i cookie sono un metodo per mantenere tali informazioni.

4
Bocchi Cinzia Ultimo aggiornamento: 10/03/2012

E-commerce. quando, in un sito di e-commerce si vuole mantenere nel carrello, fino al momento dell'acquisto, la memoria delle scelte effettuate durante la navigazione. Contatori. Quando si vuole mantenere un contatore di visite, di utenti online e cos via.

I cookie possono essere salvati sia nella memoria volatile dell'applicazione client, che sul disco sotto forma di file di testo. Nel primo caso si tratta di cookie temporanei: verranno automaticamente eliminati al momento della chiusura della finestra del browser e di tutte le finestre "figlie". Vengono anche chiamati "magic cookies" (in quanto compaiono e scompaiono). I cookie persistenti al contrario, se non cancellati manualmente, possono restare memorizzati sul client per mesi o anni a seconda del termine di validit con cui vengono impostati. Questa distinzione importante perch da essa dipende la portata con cui le applicazioni lato-server saranno in grado di tracciare l'utente.

Inviare cookie

Il comando per inviare un cookie in PHP setcookie.


boolean setcookie ( string name, string value, int expire, string path, string domain, int secure)

Solo i primi 2 parametri sono obbligatori. Gli altri saranno impostati ai valori di default, se non diversamente specificato. name: il nome del cookie. value: il contenuto del cookie. Se value coincide con la stringa vuota () significa che si intende cancellare il cookie con il nome dato. expire: lora di scadenza del cookie, cio per quanto tempo il cookie rimarr memorizzato nel client. Il valore di default 0, il che equivale a impostare un magic cookie. Solitamente si imposta utilizzando la funzione time()1 a cui si aggiunge il numero di secondi di validit (es. time()+3600) path: il percorso sul server per il quale il cookie sar valido. Se path non viene specificato il cookie si intender valido solo per i percorsi compresi nell'ambito della directory in cui si trova la pagina che lo ha inviato. All'opposto il percorso "/" il pi ampio immaginabile, e rappresenta l'intera documentRoot del webserver. Il parametro Path stato pensato per evitare che, ad esempio, una pagina presente nel percorso "/utenti/utente1" possa leggere il cookie inviato da una pagina presente in "/utenti/utente2". domain: il dominio per cui il cookie valido. Per default coincide con il dominio del server (es. www.miodominio.com) e pu coincidere anche con un indirizzo IP. secure: indica che il cookie deve essere trasmesso solo su una connessione HTTPS sicura. Quando il valore 1, il cookie viene impostato solo se esiste una connessione sicura. Il valore di default 0.

Un esempio di cookie :
<?php setcookie(userid, paperino, time() + 3600); ?>

La funzione time restituisce il timestamp attuale, cio il numero di secondi trascorsi dal 01/01/1970. Il timestamp consente di risalire alla data corrente.

5
Bocchi Cinzia Ultimo aggiornamento: 10/03/2012

Lo script contenente setcookie deve essere inserito prima di qualsiasi output. Ottenere i cookie Dopo aver impostato un cookie, possibile accedervi al successivo caricamento della pagina mediante larray globale $_COOKIE. I valori dei cookie sono caricati automaticamente in $_COOKIE. Ad esempio, per produrre in output il contenuto del cookie userid impostato in precedenza, si scrive:
<?php if (isset($_COOKIE[userid])) { echo $_COOKIE[userid]; } ?>

Loutput sar il valore del cookie di nome userid, cio paperino. I nomi dei cookie possono anche essere impostati come nomi di array. Per esempio:
<?php setcookie(cookie[uno], benvenuto); setcookie(cookie[due], gentile); setcookie(cookie[tre], paperino); ?>

Dopo che questi cookie sono stati impostati, possibile leggerli come segue:
<?php if (isset($_COOKIE[cookie])) { foreach ($_COOKIE[cookie] as $value) { echo $value <br/>; } } ?>

Eliminare i cookie Per eliminare un cookie basta chiamare setcookie con gli stessi parametri con cui stato impostato, ad eccezione di value, che dovr essere stringa vuota e di expire, che dovr essere impostato ad una data passata.

Esempio <?php
setcookie(userid, , time()-3600); ?>

Funzionalit Remember me primo caso


Ora che sappiamo che cosa sono i cookie e come utilizzarli, vediamo il codice necessario per inviare un cookie allutente che, effettuando il login, decide di selezionare lopzione Ricordami. In questo primo caso lutente, accedendo al sito, trover i campi username e 6
Bocchi Cinzia Ultimo aggiornamento: 10/03/2012

password gi impostati e potr effettuare il login solo premendo il pulsante del form. Utilizziamo allo scopo lo stesso script impiegato per il login (http://www.scribd.com/cinziabb/d/83483496-Invio-di-dati-al-server-e-gestione-con-PHP), apportando le necessarie modifiche.
login.php

<?php //verifica dell'effettuazione del login if (isset($_POST["username"])) { //recupero dei dati inviati $uid = $_POST["username"]; $pwd = $_POST["password"]; if (isset($_POST["remember"])) $remember = $_POST["remember"]; else $remember = null; //connessione al database $conn = mysql_connect("localhost", "root", "") or die("Impossibile connettersi al server"); $db = mysql_select_db("db", $conn) or die("impossibile selezionare il database"); //verifica dell'esistenza dell'utente $query = "SELECT username, password FROM utente WHERE username='$uid' AND password='$pwd'"; $result = mysql_query($query) or die("query fallita: ".mysql_error()); $trovato = false; while ($row = mysql_fetch_array($result)) $trovato = true; //disconnessione dal database mysql_close($conn); //elaborazione della risposta if ($trovato) { //lutente registrato if ($remember != null) { //se ha selezionato Remember me gli inviamo i cookie setcookie("login[username]", $uid, time() + 604800); //7 giorni setcookie ("login[password]", $pwd, time() + 604800); } //redirezione dell'utente alla sua pagina personale header("location: home.php?username=".$uid); } else //lutente non registrato e riceve un messaggio di errore echo "login errato; } ?> <html> <head> <title>Esempio Login</title> </head> <body> <form id="login-form" name="login-form" method="post" action="login.php"> <label for="username">Username</label> <input id="username" name="username" type="text" value="<?php if

7
Bocchi Cinzia Ultimo aggiornamento: 10/03/2012

(isset($_COOKIE['login'])) echo $_COOKIE['login']['username'];?>"> <br><br> <label for="password">Password</label> <input id="password" name="password" type="password" value ="<?php if (isset($_COOKIE['login'])) echo $_COOKIE['login']['password'];?>"> <br><br> <a href="#">Hai dimenticato la password?</a><br><br> <input id="remember" name="remember" value="remember" type="checkbox" <? php if (isset($_COOKIE['login'])) echo 'checked';?>> <label for="remember">Ricordami</label> <input id="login-button" type="submit" value="Login"><br><br> <a href="#">Sei un nuovo utente? Registrati</a> </form> </body> </html>

Si possono verificare le seguenti possibilit: 1) Lutente accede alla pagina senza avere un cookie impostato e senza aver effettuato il login. In questo caso lutente vedr il form senza valori preimpostati e la casella ricordami sar non selezionata. 2) Lutente accede alla pagina avendo gi un cookie impostato e senza aver effettuato il login. In questo caso lutente vedr il form con i valori di username e password preimpostati e la casella ricordami sar selezionata. 3) Lutente accede alla pagina dopo aver effettuato il login. In questo caso lutente vedr il form con i valori di username e password preimpostati e la casella ricordami sar selezionata o meno a seconda della scelta fatta dallutente allatto del login. Se allatto del login la checkbox viene selezionata, allora allutente viene anche inviato un cookie. Redirezione dellutente Nellesempio mostrato, lutente registrato viene redirezionato ad una sua pagina personale mediante il codice:

//redirezione dell'utente alla sua pagina personale header("location: home.php?username=".$uid);

La funzione header consente, appunto, di reindirizzare lutente a unaltra pagina, utilizzando la sintassi seguente: header(location: nome_file); Si osservi che il codice dellesempio contiene, dopo il nome del file, un punto interrogativo e unespressione del tipo nome_attributo=valore_attributo. In tal modo siamo in grado di passare alla pagina home.php uninformazione sul nome dellutente, che apparir nella query string. Linformazione sar anche presente nellarray $_GET allinterno dellelemento che ha come indice il nome dellattributo. Quindi, potremo recuperare il nome dellutente accedendo a $_GET[username]. 8
Bocchi Cinzia Ultimo aggiornamento: 10/03/2012

Il codice della pagina home.php il seguente.


home.php

<?php echo "Benvenuto ".$_GET['username']; ?>

Funzionalit Remember me secondo caso


Questa variante consente di effettuare il login in modo automatico. Quando lutente accede al sito, se ha i cookie impostati sul suo computer, accede direttamente senza immettere username e password.
login2.php

<?php //verifica dell'effettuazione del login if (isset($_POST["username"])) { //recupero dei dati inviati $uid = $_POST["username"]; $pwd = $_POST["password"]; if (isset($_POST["remember"])) $remember = $_POST["remember"]; else $remember = null; //connessione al database $conn = mysql_connect("localhost", "root", "") or die("Impossibile connettersi al server"); $db = mysql_select_db("db", $conn) or die("impossibile selezionare il database"); //verifica dell'esistenza dell'utente $query = "SELECT username, password FROM utente WHERE username='$uid' AND password='$pwd'"; $result = mysql_query($query) or die("query fallita: ".mysql_error()); $trovato = false; while ($row = mysql_fetch_array($result)) $trovato = true; //disconnessione dal database mysql_close($conn); //elaborazione della risposta if ($trovato) { //lutente registrato if ($remember != null) { //se ha selezionato Remember me gli inviamo i cookie setcookie("login[username]", $uid, time() + 604800); //7 giorni setcookie ("login[password]", $pwd, time() + 604800); } //redirezione dell'utente alla sua pagina personale header("location: home.php?username=".$uid); } else //lutente non registrato e riceve un messaggio di errore echo "login errato;

9
Bocchi Cinzia Ultimo aggiornamento: 10/03/2012

} else { //l'utente non ha effettuato il login //verifichiamo se esiste un cookie if (isset ($_COOKIE['login'])) { //recupero dati dai cookie $uid = $_COOKIE['login']['username']; $pwd = $_COOKIE['login']['password']; //redirezione dell'utente alla sua pagina personale header("location: home.php?username=".$uid); } } ?> <html> <head> <title>Esempio Login</title> </head> <body> <form id="login-form" name="login-form" method="post" action="login.php"> <label for="username">Username</label> <input id="username" name="username" type="text"> <br><br> <label for="password">Password</label> <input id="password" name="password" type="password"> <br><br> <a href="#">Hai dimenticato la password?</a><br><br> <input id="remember" name="remember" value="remember" type="checkbox"> <label for="remember">Ricordami</label> <input id="login-button" type="submit" value="Login"><br><br> <a href="#">Sei un nuovo utente? Registrati</a> </form> </body> </html>

Quest'opera stata rilasciata con licenza Creative Commons Attribution-ShareAlike 3.0 Unported. Per leggere una copia della licenza visita il sito web http://creativecommons.org/licenses/by-sa/3.0/ o spedisci una lettera a Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.

10
Bocchi Cinzia Ultimo aggiornamento: 10/03/2012

Potrebbero piacerti anche