http://www.vessella.it Karibu!
Appunti di programmazione

INDICE

ITALIANO
Copertina
Il topo e il mouse
L'esperanto
Vocabolario esperanto
Vocabolario swahili
Il swahili
Alcuni filmati sulla Tanzania

Scuola
Questionari in inglese

Programmazione
Archivi Access e FrontPage
Gestione Archivi con le funzioni di FrontPage
Proteggere un sito in ASP (I)
Proteggere un sito in ASP (II)
Contatore e Statistiche
Utilizzare CDONTS (provvisorio)
Le date in ASP e SQL
Connessione a un archivio Access
Configurazione di una rete (PDF)
Criteri di protezione (PDF)
Esperanta Klavaro en EeePC kun originala Xandros

ESPERANTO
Koverto
Vortaro itala
Vortaro suahila
La suahila lingvo
Videokasedoj pri Tanzanujo

KISWAHILI
Jalida
Kamusi ya kiesperanto
Lugha ya Kiesperanto
Azimio la Praha
Video juu ya Tanzania

ENGLISH
Home
The Esperanto language
The Swahili language
Some videos on Tanzania

Protezione di siti con codice di accesso, con possibilitá di richiesta di autorizzazione 

di Nino Vessella


La versione precedente di questo codice permetteva l'accesso alle pagine protette solo ai visitatori autorizzati dall'amministratore del sito. Con le modifiche illustrate qui, un visitatore puó

  • inserire tutti i dati richiesti, quindi codice compreso, e quindi leggere le pagine protette

  • inserire solo il proprio nome e il proprio indirizzo di posta elettronica e chiedere il codice di accesso, che riceverá automaticamente all'indirizzo indicato. A un visitatore giá registrato viene inviato il vecchio codice, quindi si puó utilizzare questa procedura nel caso di dimenticanze.

    La creazione e l'invio del codice di accesso é completamente automatizzata, quindi l'amministratore del sito, in questa versione, se non utilizza un appropriato pannello di gestione del proprio sito, non puó effettuare "censure" immediate.

    Il sistema ha subito varie modifiche rispetto alla prima versione, quindi fare attenzione alla parti in rosso.

    Il visitatore viene identificato dalla stringa nome/indirizzo/codice, memorizzata in un archivio Access (.mdb), che per i soliti e ovvi motivi di sicurezza é conservato in una cartella protetta (fpdb, per chi usa FrontPage).

    Questo codice presuppone la seguente struttura del sito:

    • /dominio
      • /inc
      • /fpdb
      • /kinga
      • /altrecartelle
        • paginaprotetta.asp
    • paginaprotetta.asp

    Nella cartella /inc vi sono i codici da includere, in /fpdb l'archivio .mdb dei visitatori autorizzati, in /kinga le pagine di protezione descritte qui. Le pagine protette (paginaprotetta.asp) possono trovarsi ovunque.

    La prima pagina é il solito modulo d'iscrizione da riempire, questa volta, con un nome, l'indirizzo di posta elettronica e il codice di accesso. Quest'ultimo é da inserire due volte. Inoltre, mettendo un segno di spunta nell'apposito quadratino é possibile ricevere all'indirizzo indicato il codice, nuovo per il visitatore che volesse registrarsi, vecchio per colui che l'avesse dimenticato.

    Registrazione

    cdEntra.asp


    <%
    =session.abandon
    nPagina=Request.QueryString("pag")
    %>

    <html>
    <head>
    <title> Protezione sito</title>
    </head>
    .
    .
    .

    La prima linea azzera tutte le variabili della sessione. Bisogna inserirla prima del codice <HTML>.
    La pagina protetta, come si vedrá piú avanti, passa il suo URL a cdEntra, che lo memorizza nella variabile nPagina l'URL della pagina protetta. Questa variabile servirá in seguito per ritornare alla pagina protetta, che cosí non deve essere necessariamente nella stessa cartella in cui si trovano i codici di protezione e quindi puó trovarsi in qualsiasi cartella del sito.

    Poi segue la funzione, kagua():

    <SCRIPT TYPE="text/javascript">
    <!-- function kagua() { 
      if (document.entra.nome.value == "") {
           alert("Scrivere il nome utente."); 
        return false;
        }
      else { 
       if (document.entra.nuovo.value==false) { 

        if (document.entra.cod.value != document.entra.controllo.value) { 
          alert('Il codice di accesso non é corretto!'); 
          return false;
        } 
        } else { 
         if (document.entra.indirizzo.value == "") { 
           alert ("Scrivere l'indirizzo di posta elettronica."); 
           return false;
         } 
         at=document.entra.indirizzo.value.indexOf('@'); 
         if ( (at==-1) || (document.entra.indirizzo.value.substring(at+1).indexOf('.')==-1) ) { 
          alert ("Indirizzo non valido!"); 
          return false; 
         } 
         return true; 
        } 
       } 

    //--> 

    </SCRIPT>

    .
    .
    .

    Questa funzione confronta le due immissioni di codice, se non corrispondono il visitatore viene rimandato al modulo.

    Alla funzione segue il codice html del modulo di registrazione, chiamato entra (name="entra"), con cui si chiede al visitatore di inserire i propri dati:

    .
    .
    .

    <body bgcolor=
    "#ffffff" text= "#000000" >
     <div align=
    "center" >
     <center>
      <table border=
    "0" width= "600" >
       <tr>
        <td>
          <div align=
    "center" >
           <center>
            <table border=
    "4" cellpadding= "6" cellspacing= "0" width= "475" >
             <tr>
              <td width=
    "100%" bgcolor= "#000000" colspan= "2" >
               <font color=
    "#ffffff" face= "Arial" ><strong>
               <IMG height=
    32 alt= "kufuli.gif" src= "/images/kufuli.gif" width= 32 align= left >
               &nbsp;&nbsp;&nbsp;Sito di Nino Vessella
    </strong>
               </font>
              </td>
             </tr>
         <form method= "post" name= "entra" action= "/kinga/cdkodo.asp" onSubmit= "return kagua()" >
             <tr>
              <td bgcolor=
    "#c0c0c0" valign= "top" >
               <div align=
    "right" ><p><small><font face= "Arial" >
               <strong>
    Nome del visitatore: </strong> &nbsp;
               
    </font></small>
                <input name=
    "nome" ></p>
                </div>
                 <p>
               <div align="right"><p><small><font face="Arial" >
               <strong>
    Indirizzo del visitatore: </strong> &nbsp;
               
    </font></small>
                <input name=
    "indirizzo"></p>
                <div align=
    "right">
                 <p>
                 <small>
                 <font face=
    "Arial" >
                 <u>
    Esempi </u> :&nbsp;nome_123@xxx.it <br>
                                  cognome@xxxx.it

                 </font></small>
                 </p>
                </div>
               </div>
               <div align=
    "right"><p><small><font face="Arial">
                 <strong>
    Codice d'accesso:</strong>&nbsp; </font></small>
                 <input type=
    "password" name="cod" maxlength=10></p>
               </div>
               <div align=
    "right"><p><small><font face="Arial">
                <strong>
    Verifica Codice d'accesso:</strong>&nbsp; </font></small>
                <input type=
    "password" name="controllo"></p>
               </div>
               <div align= "left" ><p><small><font face= "Arial" >
                <strong>
    Codice dimenticato o nuovo? </strong>
                </font></small>
                <input type=
    "checkbox" name= "nuovo" value= "ON" >
               </br>
               Ti sarà inviato all'indirizzo suindicato. </p>

               <input type="hidden" name="pagina" value="<%=nPagina%>">

               </div>
              </td>
             <td width=
    "80" bgcolor="#c0c0c0" valign="top" align="middle">
               <div align=
    "left">
                <div align=
    "center"></div>
                <div align=
    "center"></div>
                <div align=
    "center">
                 <center><p><small><font face=
    "Arial">
                  <input type=
    "submit" value="&nbsp;&nbsp;&nbsp;Invia&nbsp;&nbsp;&nbsp;">
                   </font></small></p>
                 </center>
                </div>
               
    <div align="center" ><center><p><small><font face="Arial">
                  <input type=
    "reset" value="Annulla">
                  </small></FONT></p></center>
               
    </div>
                <div align=
    "center"><center><p><small><font face="Arial">
                  <input type=
    "button" value="Esci" onClick="history.go(-1)">
                  </small></FONT></p></center>
                </div>

              </td>
             </tr>
            </form>
           </table>
           </center>
          </div>
         </td>
       </tr>
      </table>
     </center>
     </div>
    </body>
    </html>

    Si tratta di un "comune" modulo di inserimento dati. Notare soltanto la variabile nascosta (hidden) pagina per inviare l'URL della pagina protetta al codice successivo e l'azione del bottone Esci che simula il pulsante Indietro del programma di navigazione.
    Infine i dati  vengono inviati alla pagina con il codice per la ricerca del visitatore nell'elenco di quelli autorizzati.

    Controllo registrazione

    cdkodo.asp

    In questa pagina innazitutto notare l'inclusione del file ilpostinoinc.asp. Esso contiene la funzione Invia() per la spedizione dei messaggi tramite CDONTS (illustrata in Esempio di utilizzo di CDONTS)
    Subito dopo si definiscono e inizializzano alcune variabili con i valori inseriti nel modulo della pagina cdentra.asp, in particolare nPagina che contiene l'URL della pagina protetta, nNome, nCod e nIndirizzo che contengono i dati del visitatore e lNuovo che serve per individuare il visitatore che vuole un codice di accesso.

     
    <!-- #include virtual="/inc/ilpostinoinc.asp" -->

    <%
    ' adovbs.inc:
    Const adOpenKeyset = 1
    Const adLockPessimistic = 2
    Const adCmdText = &H0001

    Dim oConn
    Dim oRS
    Dim lTrovato
    Dim sErr
    Dim nNome
    Dim nCod
    Dim nIndirizzo
    DIM lNuovo

    lNuovo=false

    if Request.form("nuovo")="ON" then

       lNuovo=true

    end if

    nNome=request.form("nome")
    nCod=request.form("cod")
    nIndirizzo=request.form("indirizzo") nPagina=request.form("pagina")

    .
    .
    .

    Poi si controlla la variabile lNuovo, se é vera il visitatore é nuovo o ha dimenticato il codice di accesso, allora si cercano nome e indirizzo del visitatore nell'archivio kodoj.mdb, se non vi sono allora, ovviamente, si tratta di una nuova iscrizione, quindi:

    • si genera un codice di accesso con la funzione fn_genKodo
    • si registra il tutto
    • si manda un messaggio all'indirizzo del visitatore con il codice personale
    • si visualizza un messaggio con cui si informa il visitatore dell'avvenuta registrazione e dell'invio del codice personale
    Questa informazione viene visualizzata dal codice contenuto nella pagina cdAvviso.asp.
    L'accesso comunque non viene permesso a coloro che non usano il proprio indirizzo, cioé quello a cui viene inviato il codice.
    Se i dati inseriti dal visitatore vengono trovati, allora si tratta di qualcuno che ha dimenticato il codice di accesso. Quindi, non si genera alcun codice, e il codice che viene inviato al visitatore é quello che aveva giá.
    Notare che il codice, essendo generato automaticamente, puó essere personalizzato solo rivolgendosi all'amministratore del sito che puó modificare l'archivio.

     
    .
    .
    .
    If lNuovo then

     ' Nuovo visitatore

     SQL = "SELECT * FROM codici WHERE nome='" & nNome & _
       "' and indirizzo='" & nIndirizzo & "'"

     Set oRS=Server.CreateObject("ADODB.Recordset")
     oRS.Open SQL,"DRIVER={Microsoft Access Driver (*.mdb)};DBQ="& _
     Server.MapPath("/fpdb/kodoj.mdb") & ";", _
     adOpenKeyset, adLockPessimistic, adCmdText

     If oRS.EOF then
       ' Se non é stato trovato, si tratta di una richiesta
       ' di iscrizione

       ' Genera il codice e inserisce in archivio
       sKodo=fn_GenKodo(10,"")

       oRS.AddNew
       oRS.Fields("nome") = nNome
       oRS.Fields("indirizzo") = nIndirizzo
       oRS.Fields("codice")= sKodo
       oRS.Update
     end if
     oRS.MoveFirst

     sKodo=oRS("codice")

     oRS.Close
     Set oRS = Nothing

     ' Non permette l'accesso perché prima lo spedisce al richiedente
     ' per verificare l'esattezza dell'indirizzo
     ' Le seguenti variabili sono da personalizzare!!!
     sOggetto="Karibu! Codice di accesso"
     sSaluti="Salve " & nNome & ", " & vbCrLf
     sTesto1="grazie per esserti registrato al sito Karibu! " & vbCrLf & _
     "Per visitare le pagine richieste immetti i seguenti dati: " & _
     " - Nome utente: " & nNome & vbCrLf & " - Indirizzo: " & nIndirizzo & vbCrLf & _
     " - Codice di accesso: " & sKodo & vbCrLf sTesto2 = " Se dovessi dimenticare il codice di accesso, potrai richiederlo con la stessa procedura " & _
     " seguita per l'iscrizione. Ricordati di usare lo stesso nome utente e lo stesso indirizzo " & _
     " di cui sopra. " & vbCrLf
     sTesto3 = " Questi dati non saranno diffusi in alcun modo senza una tua esplicita autorizzazione. " & _
     " Essi serviranno solo per registrare i tuoi risultati nello svolgimento degli esercizi. "
     sTesto4 = vbCrLf & vbCrLf
     sTesto5 = " Grazie, " & vbCrLf & " Nino" & vbCrLf & " - Karibu!"
     sMessaggio = sSaluti & sTesto1 & sTesto2 & sTesto3 & sTesto4 & sTesto5
     ' Anche qui bisogna inserire l'indirizzo appropriato
     sErr = Invia( _
      ":nino@vessella.it", _
      nPagina, _
      nIndirizzo, _
      nNome, _
      sOggetto, _
      sMessaggio, true )

     If sErr = "" Then

      Response.Redirect "/kinga/cdAvviso.asp"
      Response.Flush
      Response.End

     else

      ' Messaggio di errore
      Response.Write ("Risultato:" & "<BR>")
      Response.Write ("..." & sErr)
     End If
    .
    .
    .

    Se, invece, la variabile lNuovo é falsa si attiva la procedura di controllo della registrazione e ammissione alla lettura della prima pagina protetta con il comando response.redirect "PrimaPagina.asp". Se non risulta iscritto o se ha inserito dati non corretti viene invitato a controllare i dati (response.redirect "cderrato.asp").

    La protezione delle pagine si basa sulla variabile di sessione ID, Session("ID"), a cui viene assegnata la stringa nNome & nIndirizzo & nCod oppure viene viene lasciata vuota.

     
    .
    .
    .
    else
     lTrovato=true

     Set oConn = Server.CreateObject("ADODB.Connection")
     oConn.Open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ="& _
     Server.MapPath("/fpdb/kodoj.mdb")

     SQL = "Select * From codici where nome='" & nNome & _
     "' and indirizzo='" & nIndirizzo & "' and codice='" & nCod & "'"

     Set oRS = oConn.Execute(SQL)

     if oRS.EOF then

      lTrovato=false

     end if

     oRS.Close oConn.Close

     Set oRS = Nothing
     Set oConn = Nothing

     if lTrovato then

      Response.Cookies("biscotto")= nNome & "&" & nIndirizzo & "&" & nCod
      Response.Cookies("biscotto").Expires="December 30, 2035"
      Session("ID")= nNome & "&" & nIndirizzo & "&" & nCod
      Response.Redirect nPagina

     else

      Session("ID")=""
       Response.Redirect "/kinga/cdErrato.asp"
     end if

    end if

    .
    .
    .

    In fondo alla pagina si trova una funzione, fn_GenKodo(), per la generazione automatica di codici di accesso.
    Notare che utilizza due parametri:

    • nLunghezza= lunghezza del codice di accesso da generare
    • sCarValidi = caratteri utilizzabili, in mancanza la funzione utilizza i caratteri: A-Za-z0-9.

     
    .
    .
    .
    Function fn_GenKodo( nLunghezza, sCarValidi)
    ' nLunghezza = lunghezza del codice di accesso da generare
    ' sCarValidi = caratteri utilizzabili
    ' Se non vengono specificati di utilizzano i caratteri: A-Za-z0-9

    Const sCarPredef = "abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZ0123456789" 

    Dim nContatore
    Dim sRet
    Dim nNumero
    Dim nLength

    Randomize

    If sCarValidi = "" Then
     sCarValidi = sCarPredef
    End If

    nLength = Len(sCarValidi)

    For nContatore = 1 To nLunghezza
     nNumero = Int((nLength * Rnd) + 1)
     sRet = sRet & Mid( sCarValidi, nNumero, 1 )
    Next

    fn_GenKodo = sRet

    End Function
    %>

    Iscrizione di un nuovo visitatore

    cdAvviso.asp

    <!--#include virtual ="/kinga/cdentra.asp"-->

    <%
    Response.Write("<CENTER>" & _ 
    "La richiesta é stata accolta.<BR>" & _ 
    "Il codice di accesso é stato inviato all'indirizzo indicato.<BR></CENTER>")
    %>

    Questa pagina contiene solo queste poche righe di codice che scrive un messaggio nel documento cdentra.asp con il comando Response.write. Il messaggio informa il visitatore dell'avvenuta iscrizione e dell'invio del codice al suo indirizzo di posta elettronica.

    Visitatore non autorizzato o dati errati

    cdErrato.asp

    <!--#include virtual ="/kinga/cdentra.asp"-->
    <%
    Response.Write("<center> Hai inserito dati non validi. Per favore riprova.<BR></CENTER>")
    %>

    Anche questa pagina contiene solo queste poche righe di codice che scrive un messaggio nel documento cdentra.asp con il comando Response.write. Il messaggio avverte il visitatore che i dati inseriti sono errati e che quindi vanno reinseriti.

    Pagina protetta

    Ecco, infine la pagina (asp) protetta. Dopo aver inserito i dati corretti, il visitatore viene ammesso alla pagina cercata (in questo caso la prima pagina) nella quale deve essere inserito il seguente codice.  

    <%
    Session("id")=Request.Cookies("biscotto")

    If Session("id") = "" Then
     Response.Redirect "/kinga/cdEntra.asp?pag=" & _
     URLEncode("/paginaprotetta.asp")
    End if
    %>

    <HTML>
    <HEAD>
    <TITLE>Sito di Nino Vessella</TITLE>
    .
    .
    .

    Contenuto della pagina

    .
    .
    .

    </HTML>

    Il codice deve essere inserito all'inizio di tutte le pagine asp da proteggere. Esso controlla l'accesso alla pagina tramite la variabile di sessione ID, se é vuota il visitatore non é autorizzato e quindi gli viene presentata la pagina di registrazione cdentra.asp. La variabile di sessione ID é stata valorizzata dal codice cdKodo, ma se il visitatore é stato autorizzato durante una sua precedente visita nel suo elaboratore ha un "biscottino" che gli permette di richiamare la pagina senza dover reinserire i suoi dati.

    Se si vuole disattivare questa funzione basta togliere la riga session("id")=Request.Cookies("biscotto").

    Questo codice non permette ai visitatori non autorizzati l'accesso alla pagina senza prima passare per cdentra.asp.

    Le sessioni durano 20 minuti, ma questo tempo puó essere cambiato assegnando all'inizio della pagina kdkodo.asp alla variabile session.timeout il valore desiderato (nell'esempio  5 minuti):

    session.timeout = 5

    Ricordarsi di salvare la lista o l'archivio dei visitatori (nome/indirizzo/codice) in una cartella nascosta diversa da quella delle pagine protette in modo da impedirne il prelevamento.

    Ricordarsi, inoltre, di personalizzare tutte le variabili che hanno i miei dati (biscotto, mailto:nino@vessella.it, ecc.).

    Per provare questo sistema, visitare la pagina Esercizi di Inglese tecnico.

    Scarica i file

    Ultima modifica: 20010301
     Numero di lettori dal 16/12/2000:  

 


© Nino Vessella , 1996-.
Diritti riservati. Nessuna parte può essere riprodotta, in qualsiasi forma o mezzo, senza citare la fonte.
Ĉiuj rajtoj rezervitaj. Neniu parto povas esti reproduktita, en kiu ajn formo au per kiu ajn metodo, sen mencii ĉi tiun fonton.
Haki zote zimehifadhiwa. Hairuhusiwi kunakili sehemu yoyote bila kuitaja asili yake hii.
All rights reserved. No part may be reproduced, in any form or by any means, without mention of this source.