Redazione
a- a+

Realizzare un sistema di login (I Parte)

Vediamo come realizzare un sistema di accesso riservato sicuro con ASP 3.0

Introduzione
Un sistema che permette di limitare l'accesso ad una certa parte del sito è essenziale in qualsiasi progetto web. Per accedere a questo corso è stato necessario autenticarsi, la stessa cosa vale per il forum e altre decine di aree riservate del nostro sito piu' o meno accessibili.
Realizzeremo quindi un sistema di accesso riservato molto sicuro.

Il progetto
Realizzeremo un sistema base che prevede una chiave unica di accesso valida per tutti. Il sistema dovrà validare i dati inseriti, controllare se sono quelli di accesso e verificare se la sessione è scaduta. Nella lezione successiva, implementeremo un accesso con controllo dei dati attraverso un database (per garantire a ciascuno utente dati di accesso differenti), il login sarà automatico e vedremmo anche come effettuarlo lavorando sul nostro server.

Le pagine protette
Le pagine che dobbiamo proteggere possono essere normali, utilizzare asp o quant'altro l'importante è che hanno l'estensione .asp in quanto nella loro prima riga dovremmo inserire quanto segue:

<!--#include file="lez07_login.asp"-->

Questo semplice comando ci permetterà di effettuare un include della pagina lez07_login.asp che è la pagina incaricata di controllo se l'utente ha i permessi o meno per accedere all'area riservata.

Codice 7.1

<!--#include file="lez07_login.asp"-->
<html>

<body>
<!--
www.webmasterpoint.org
-->

<p align="center"><b><font face="Verdana" size="2">
Benvenuti nella zona riservata del nostro sito web
</font></b></p>

<p align="center"><b><font face="Verdana" size="2">
<a href="lez07_logout.asp" title="Esci">LOGOUT
</a></font></b></p>

</body>

</html>

Il listato 7.1 è una normale pagina .asp che contiene come 1° riga l'include alla pagina che deve effettuare il controllo.

Il modulo
Il form ci permette di rendere possibile l'accesso ad un'area riservata inserendo dei dati di login. Questi dati possono essere forniti e "creati" in modi differenti e solitamente sono 2: Username e Password (NomeUtente e Parola di accesso). E' raro inserire altri parametri di sicurezza, in quanto il loro utilizzo è già sicuro (provate ad immaginare le combinazioni che ci sono tra 25 lettere e 10 numeri in 2 parole, impossibile!), solo le banche online (home banking) generalmente chiedono un'ulteriore codice di accesso.

Quindi il modulo dovrà contenere un semplice form con 2 campi che dovrà "puntare" (avere come action) all'url della homepage dell'area riservata.

Codice 7.2

<html>

<body>
<!--
www.webmasterpoint.org
-->

<div align="center">
<center>
<form method="POST" action="lez07_index.asp">
<table border="1" width="438" height="29">
<tr>
<td width="131" height="16"><font face="Verdana" size="2">Username:
</font></td><td width="301" height="16">
<input type="text" name="username" size="20"></td>
</tr>
<tr>
<td width="131" height="13"><font size="2" face="Verdana">Password:
</font></td>
<td width="301" height="13">
<input type="password" name="password" size="20"></td>
</tr>
<tr>
<td width="438" height="1" colspan="2">
<p align="center">
<input type="submit" value="Login &gt;&gt;&gt;" name="B1"></td>
</tr>
</table>
<input type="hidden" name="tipo" value="login">
</form>
</center>
</div>

</body>

</html>

Questo modulo ha 3 campi, i primi 2 visibili, l'ultimo no.

username E' una casella di testo di tipo text.
password E' una casella di testo di tipo password in quanto ciò che viene digitato al suo interno viene automaticamente oscurato.
tipo E' un campo nascosto chiamato tipo che contiene come valore "login", il che permette facilmente di individuare che l'utente proviende dal modulo (questo parametro era evitabile, ma comunque utile anche per progetti futuri).

Il modulo apparirà in questo modo:

Username:
Password:

 

Il cuore dello script
Ora analizziamo la pagina che effettua il controllo e che decide se l'utente può accedere o meno all'area riservata.

Codice 7.3

<%

'Funzione che controlla l'inserimento di 
'caratteri accettabili o meno
public function check_nick (allow, nick)
  nick = nick
  check_nick = true
  for i = 1 to len(nick)
    if instr(allow, mid(nick,i,1)) = 0 then check_nick = false
  next
end function

'Controllo se è già stato effettuato l'accesso
If Session("permesso_entrata") <> True then

  'Controllo se è stato effettuato l'accesso 
  'dal modulo di login
  Dim tipo
  tipo = Request.Form("tipo")

  'Se è stato effettuato dal modulo entra
  If tipo = "login" then

    'Acquisisco i dati di accesso
    Dim username, password
    username = Trim(Request.Form("username")) 
    ' Utilizzo trim per togliere spazi ai lati della parola
    password = Trim(Request.Form("password"))

    'Controllo l'eventuale inserimento di caratteri speciali 
    '(non sono autorizzati, per motivi di sicurezza)
    if check_nick ("abcdefghijklmnopqrstuvwxyzABCDEFGHI -->
--> JKLMNOPQRSTUVWXYZ0123456789", username) = false then
      response.redirect("lez07_modulo.asp?err=103")
    end if
    if check_nick ("abcdefghijklmnopqrstuvwxyzABCDEFGHI-->
-->JKLMNOPQRSTUVWXYZ0123456789", password) = false then
      response.redirect("lez07_modulo.asp?err=103")
    end if

    'Controllo correttezza dati inseriti
    If username = "admin" AND password = "test" then

      Session("permesso_entrata") = True

    Else 

       Session("permesso_entrata") = False
       Response.Redirect "lez07_modulo.asp?err=101"

    End If

  Else

    Session("permesso_entrata") = False
    Response.Redirect "lez07_modulo.asp?err=102"

  End If

End If
%>

Vediamo di analizzare il Codice 7.3 una parte alla volta.

public function check_nick (allow, nick)
  nick = nick
  check_nick = true
  for i = 1 to len(nick)
    if instr(allow, mid(nick,i,1)) = 0 then check_nick = false
  next
end function

Questa è una funzione, chiamata check_nick, a cui passo 2 parametri: allow e nick. In allow passo tutti i caratteri che voglio che siano validi, per motivi di sicurezza sarebbe bene passare:

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789

ovvero tutte le lettere minuscole dell'alfabeto, quelle maiuscole e i numeri. In nick passerò una volta l'username e una volta la password per controllare la loro esattezza.

Imposto la funzione (che acquisisce valori boolean) subito uguale a True e viene eseguito un ciclo da 1 al numero di lettere della parola che controlla se in allow c'è la lettere che si trova nella posizione x. Se una lettera non viene trovata in allow la funzione viene impostata a False.

L'accesso alle pagine viene garantito da una variabile di sessione

Session("permesso_entrata")

che se impostata a True permette l'accesso alle pagine riservate, altrimenti effettua il controllo dei permessi di login.
Infatti per prima cosa viene controllato il valore della Session, se è diverso da True, controlliamo se l'utente che sta richiedendo la pagina proviene dal modulo di login.
Questo controllo resta mosto semplice grazie al campo nascosto tipo del modulo.

Se l'utente proviene dal modulo:

'Controllo se è già stato effettuato l'accesso
If Session("permesso_entrata") <> True then

  'Controllo se è stato effettuato l'accesso
  'dal modulo di login
  Dim tipo
  tipo = Request.Form("tipo")

  'Se è stato effettuato dal modulo entra
  If tipo = "login" then

allora vengono prelevati username e password e controllati con al funzioni chek_nick. Se uno dei due contiene caratteri non autorizzati si viene rimandati alla pagina del modulo di login (lez07_modulo.asp).

Se username e password contengono caratteri accettati viene effettuato finalmente il controllo dei dati:

    If username = "admin" AND password = "test" then

      Session("permesso_entrata") = True

    Else

       Session("permesso_entrata") = False
       Response.Redirect "lez07_modulo.asp?err=101"

    End If

Questo script ci permette di autorizzare l'accesso a quelle persone che digitano come username = admin e come password = test. L'accesso viene autorizzato impostando la Sessione a True, se i dati non sono corretti la Sessione viene impostata a False e si viene reindirizzati al modulo.

Infine il codice:

    Else

       Session("permesso_entrata") = False
       Response.Redirect "lez07_modulo.asp?err=101"

    End If

non autorizza l'accesso e rimanda al modulo in caso la Sessione è False e che l'utente non proviene dal modulo, ma ha provato un accesso diretto ad una pagina riservata.

Logout
La pagina di logout è una semplice pagina che permette di uscire dall'area protetta. Basta fare un link a questa pagina e si è scollegati.

Codice 7.4

<%

Session("permesso_entrata") = False
Response.Redirect "lez07_modulo.asp?err=102" 

%>

Questa pagina non fa molto, anche se è molto importante: imposta la Sessione a False ed effettua un redirect al modulo di login.

Gestione degli errori
Come è possibile notare, tutti i redirect alla pagina lez07_modulo.asp riportano un codice all'interno della variabile err. Questo codice indica che tipo di errore si è verificato. Gli errori, poi saranno da gestire direttamente nel modulo, vediamo come.

Codice 7.5

<!-- INIZIO Gestione visualizzazione errori -->
<%
err = Cint(Request.QueryString("err"))
If err > 100 then
%>
<p align="center"><font face="Verdana" size="1" color="#FF0000">
<b>IMPORTANTE:</b></font><font face="Verdana" size="1"><b>Errore </b>
<%
Select Case err

Case 101
Response.Write("UsernamePassword non corretti")

Case 102
Response.Write("Sessione Scaduta. Effettuare il login da questo modulo")

Case 103
Response.Write("Username e Password non possono 
contenere caratteri speciali per motivi di sicurezza")

End Select
%>
</font></p>
<%
End if
%>
<!-- FINE Gestione visualizzazione errori -->

Con questo codice viene gestita la possibilità di visualizzare un messaggio di errore, e quale messaggio in base al codice di errore inviata alla pagina del modulo. Questo codice ora andrà inserito nella pagina del modulo.

Codice 7.6

<html>

<body>
<!--
www.webmasterpoint.org
-->
<!-- INIZIO Gestione visualizzazione errori -->
<%
err = Cint(Request.QueryString("err"))
If err > 100 then
%>
<p align="center"><font face="Verdana" size="1" color="#FF0000">
<b>IMPORTANTE:</b></font><font face="Verdana" size="1"><b>Errore </b>
<%
Select Case err

Case 101
Response.Write("UsernamePassword non corretti")

Case 102
Response.Write("Sessione Scaduta. Effettuare il login da questo modulo")

Case 103
Response.Write("Username e Password non possono contenere 
caratteri speciali per motivi di sicurezza")

End Select
%>
</font></p>
<%
End if
%>
<!-- FINE Gestione visualizzazione errori -->

<div align="center">
<center>
<form method="POST" action="lez07_index.asp">
<table border="1" width="438" height="29">
<tr>
<td width="131" height="16"><font face="Verdana" size="2">Username:
</font></td><td width="301" height="16">
<input type="text" name="username" size="20"></td>
</tr>
<tr>
<td width="131" height="13"><font size="2" face="Verdana">Password:
</font></td>
<td width="301" height="13">
<input type="password" name="password" size="20"></td>
</tr>
<tr>
<td width="438" height="1" colspan="2">
<p align="center">
<input type="submit" value="Login &gt;&gt;&gt;" name="B1"></td>
</tr>
</table>
<input type="hidden" name="tipo" value="login">
</form>
</center>
</div>

</body>

</html>

Controllo dati
La funzione check_nick è molto importante perchè permette di non inserire del codice che potrebbe far impazzire lo script e permettere l'accesso ad un'area riservata pur non essendo autorizzato.

Questa situazione si può evitare elimando caratteri come:

?  %  &  £  '  " (e lo spazio)

L'unico carattere che da solo può essere innocuo e utile è _ la sottolineatura (underscore), che possiamo quindi inserire nell'elenco di caratteri accettati.



Ti potrebbe interessare anche

commenta la notizia

C'è 1 commento
Sara
Hai dubbi su questo articolo?