|

GESTIONE UTENTI: PROBLEMI DI SICUREZZA

Nelle
scorse settimane abbiamo analizzato come creare e gestire
un sistema che permetta di proteggere determinate pagine
asp consentendone la visualizzazione solo ad utenti
registrati, quindi in possesso di username e password
valide.
In questo modo gli utenti sono invitati a registrarsi
selezionando username e password: dati che vengono inseriti
in un database.
Quando si cerca di visualizzare una pagina protetta
viene richiesto il nome utente e la password, senza
dei quali non dovrebbe essere possibile accedere all'area
riservata.
Il procedimento è stato spiegato nell'esempio
chiamato Registrazione degli utenti, disponibile
all'indirizzo http://www.amicopc.com/asp/register.asp
Se
però il codice di queste pagine non è
scritto correttamente c'è la possibilità
di entrare nella sezione riservata anche senza conoscere
nome utente o password.
Anzi: se noi conosciamo il nome di un utente, prenderemo
il suo posto, anche se non ne conosciamo la password.
Il tutto per colpa di un apostrofo...
Immaginiamo
le conseguenze di una situazione simile: se creo delle
sezioni riservata significa che, per qualche motivo,
desidero che le informazioni in esse contenute siano
visibili solo a determinate persone. La prima conseguenza
è quindi la possibilità, per utenti non
autorizzati, di visualizzare informazioni altrimenti
riservate.
Questo può essere già un problema.
In
secondo luogo occorre ricordare che in fase di registrazione
vengono richiesti molti dati, tra cui nome, cognome,
indirizzo reale, data di nascita, numero di telefono....
molte volte anche codice fiscale o altri dati sensibili.
Un sistema di gestione ben fatto deve consentire al'utente
di modificare tali dati facilmente: quindi l'utente
inserendo il proprio nome utente e password ottiene
l'accesso ad un pannello di controllo in cui sono visualizzati
i dati inseriti al momento della registrazione, dandogli
così la possibilità di modificarli.
Tutto bene se questi dati sono visibili solo da parte
dell'utente autorizzato: se un'altra persona avesse
accesso a questi dati sarebbe quantomeno fastidioso
(questi infatti saprebbe tutto di me...). Con il sistema
che andremo a vedere in queste pagine è possibile
loggarsi (ovvero autenticarsi) al posto di un determinato
utente, ottenendo così il permesso di visualizzare
dati personali, modificare la password, gestire le operazioni
a lui riservate...
Vediamo
innanzitutto il metodo comunemente utilizzato per proteggere
una pagina asp.
REGISTRAZIONE
Per prima cosa l'utente deve registrarsi, inserendo
i dati richiesti. Tra questi dovrà scegliere
un nome utente e password: informazioni che vengono
registrate in un database in due campi che per convenzione
possiamo chiamare user e pwd.
CHECK.ASP
Per entrare nella sezione riservata occorre inserire
username e password in un modulo. Cliccando sull'apposito
pulsante questi dati vengono inviati ad una pagina che
controlla se l'accoppiata username-pwd esiste nel database.
Se c'è creea quindi la session e reindirizza
l'utente verso la pagina riservata.
Se la pagina in questione non trova lo username o la
password l'utente viene reindirizzato verso una pagina
di errore.
Il codice di questa pagina può essere simile
al seguente:
|
<%
user=request.form("user")
pwd=request.form("pwd")
|
Per
prima cosa prendo il nome utente e la password inseriti
nel modulo. Quindi creo la connessione con il database
e preparo il recordset che dovrà contenere i
miei dati.
|
Dim
Conn
Set Conn = Server.CreateObject("ADODB.Connection")
conn.Open "driver={Microsoft Access Driver
(*.mdb)};dbq=" & server.mappath("pwd.mdb")
Dim rs
Set rs = Server.CreateObject("ADODB.Recordset")
|
Ora
preparo la stringa di selezione, chiedendo di selezionare
dalla tabella pwd il record il cui campo user
corrisponde al nome utente inserito nel modulo
e dove il campo pwd corrisponde alla password
inserita.
La satringa utilizzata consente di avere anche più
utenti con lo stesso username: infatti io chiedo di
trovare il record con una determinata coppia di username
e password. Non mi interessa se esistono più
utenti omonimi: a me interessa che ci sia almeno un
utente con quel nome utente e quella
password.
|
rs.Open "select * from pwd where user like
'"& user &"' and pwd like '"&
pwd &"'", conn
|
Se
il cursore arriva in fondo al file senza trovare nessuna
corrispondenza (if rs.eof) significa che non
esiste nessun record con quell'accoppiata username-password.
Pertanto chiudo connessione e recordset e reindirizzo
l'utente verso una pagina di errore.
|
if
rs.eof then
rs.close
set rs=nothing
conn.close
set conn=nothing
response.redirect "accesso_negato.htm"
|
Se
il cursore non arriva alla fine del file (else...)
significa che l'utente esiste e che quindi può
entrare.
Creo quindi la session sbagliato (teoricamente
dovrebbe chiamarsi autenticato: in realtà
la chiamiamo sbagliato per distinguerla da quella
che andremo a creare successivamente con il sistema
corretto, che invece chiameremo giusto. In questo
caso la pagina protetta dovrà controllare se
esiste la session sbagliato-giusto e non più
la session autenticato!)
Inoltre creiamo anche una session che chiamiamo utente
in cui memorizziamo il nome dell'utente: in questo
modo tutte le pagine che andremo a visitare potranno
sapere quale utente le sta visualizzando, in modo da
regolarsi di conseguenza.
Quindi indirizziamo l'utente verso la prima pagina della
sezione riservata.
|
else
session("sbagliato")="si"
session("utente")=rs("user")
rs.close
set rs=nothing
conn.close
set conn=nothing
response.redirect "prima.asp"
end if
%>
|
PAGINA
PROTETTA
Quando l'utente inserisce il proprio username e
password viene creato un oggetto session (che qui possiamo
chiamare autenticato) che certifica che
l'utente ha inserito lo username e la password corretti
e qundi è autorizzato ad entrare nella sezione
riservata.
Quindi la pagina protetta dovrà controllare semplicemente
se esiste questa session. Se essa non esiste significa
che l'utente non si è autenticato, quindi viene
indirizzato verso una pagina di errore.
Il metodo generalmente utilizzato può essere
<%
if session("autenticato")<>"ok"
then response.redirect "accesso_negato.htm"
%>
La
pagina in questione dovrò poi prendere il nome
dell'utente memorizzato nella session utente:
in questo modo può sapere quale utente sta visualizzando
la pagina e mostrargli quindi solo le informazioni che
ha diritto di vedere.
Il
sistema appena descritto è disponibile online
all'indirizzo http://www.amicopc.com/test/pwd/index.htm,
utilizzando il modulo chiamato SBAGLIATO.
Gli utenti presenti in database sono i seguenti:
|
USERNAME
|
PASSWORD
|
|
primo
|
001
|
|
secondo
|
002
|
|
terzo
|
003
|
|
quarto
|
004
|
|
quinto
|
005
|
|
sesto
|
006
|
|
settimo
|
007
|
|
ottavo
|
008
|
|
nono
|
009
|
|
decimo
|
010
|
|
Quindi
per accedere alla pagina riservata bisogna utilizzare
una di queste combinazioni: se si provasse ad entrare
con la combinazione primo e 009 verrebbe
visualizzata unicamente la pagina di errore.
Inoltre anche cercando di visualizzare direttamente
la pagina prima.asp
(evitando quindi la pagina index.htm con
il modulo di richiesta nome e password) si ottiene solo
un pagina di errore che invita l'utente ad autenticarsi.
Sembrerebbe quindi che abbiamo raggiunto il nostro scopo:
la pagina è visibile solo dagli utenti registrati
e se non si conosce l'accoppiata nome utente e password
non si è in grado di visualizzare la pagina.
Ma
è davvero così? Siamo sicuri che non esiste
un modo per entrare anche senza conoscere username o
password?
|