Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21
  1. #1

    Consigli e pareri su un sistema di login sicuro.

    Ciao a tutti,
    mi piacerebbe dicutere insieme a voi dei vari sistemi di login disponibili e conosciuti per cercare di imparare soprattutto cose nuove grazie a tutti voi.

    In generale quando ho la necessità di proteggere qualche pagina web e quindi limitare l'accesso ad esse, uso un sistema di login molto semplice ma efficace che è così composto:

    Pagina Login
    L'utente inserisce il proprio username e la propria password in un apposito modulo.
    I dati inseriti vengono confrontati con quelli presenti nel db, per motivi di sicurezza la password archiviata nel db è criptata.
    Se l'username e la password inseriti nel modulo corrispondono a quelle memorizzate nel DB allora l'autenticazione è avvenuta con successo e dichiaro una variabile di sessione con un determinato valore.

    Script per la verifica
    In ogni pagina "protetta" inserisco un semplice script che mediante un istruzione IF controlla che il valore della variabile di sessione (la variabile creata quando il login è andato a buon fine) coincida proprio con quello prefissato. In caso contrario effettuo un redirect alla pagina di errore perchè l'utente non è loggato.

    Ho cercato di riassumere il medoto di login usato.
    Non ho mai avuto problemi nel usare questo metodo e soprattutto ha sempre funzionato bene, ma credo che abbia diverse limitazioni e che soprattutto esistano dei metodi ancora più sicuri.

    Ad esempio questo metodo non effettua nessun controllo degli user già loggati e teoricamente permette il login contemporaneo allo stesso user.

    Voi cosa ne pensate? Come fate voi a proteggere le pagine web mediante login?

  2. #2
    Utente di HTML.it L'avatar di carlo2002
    Registrato dal
    Jun 2002
    Messaggi
    2,746
    Si, sembra che ci sia tutto, faccio pure io più o meno così.

    Riguardo alla verifica di username e password, sembra che sia una debolezza nella sicurezza estrarli dal database per confrontarli con i valori inviati tramite il form, quindi ne verifico la presenza tramite COUNT.

    Per avere il valore della variabile di sessione il più possibile unico uso
    Codice PHP:
    md5(uniqid(microtime())) ; 
    Anch'io uso verificare, ad ogni pagina richiesta, la validità della variabile di sessione solo che non inserisco in ogni pagina un controllo con IF, bensì uso sempre la stessa pagina in cui effettuo sempre la verifica della variabile di sessione, se il controllo è positivo allora permetto l'inclusione nella stessa della sezione richiesta altrimenti no. Le pagine che vengono così incluse le tengo in una directory il cui accesso viene inibito tramite permessi chmod ed in più in ognuna di esse all'inizio metto una clausola che ne permette l'uso solo se incluse, ossia se vengono richiamate direttamente non possono funzionare. Ecco il codice di questo ultimo controllo.
    Codice PHP:
    if ( __FILE__ == str_replace("/""\\"$_SERVER['SCRIPT_FILENAME']) ) {
    exit(
    '<h2>Accesso non consentito</h2>') ; } 
    Inoltre puoi aumentare la sicurezza con l'utilizzo di una connessione protetta, per evitare che un utente la eviti cambiando nella barra dell'URL https con http lo puoi forzare così
    Codice PHP:
    if ( empty($_SERVER['HTTPS']) or $_SERVER['HTTPS'] != "on" ) {
    header("Location: "https//www.tuosito.ext/".$_SERVER['PHP_SELF']."") ;
    exit ; } 
    Errare humanum est, perseverare ovest

  3. #3
    Originariamente inviato da carlo2002

    Per avere il valore della variabile di sessione il più possibile unico uso
    Codice PHP:
    md5(uniqid(microtime())) ; 
    Non ho ben capito perchè fai questo. Quindi tu alla variabile di sessione che poi ti permette di effettuare il controllo assegni un valore univoco a caso?


    Originariamente inviato da carlo2002
    Inoltre puoi aumentare la sicurezza con l'utilizzo di una connessione protetta, per evitare che un utente la eviti cambiando nella barra dell'URL https con http lo puoi forzare così
    Codice PHP:
    if ( empty($_SERVER['HTTPS']) or $_SERVER['HTTPS'] != "on" ) {
    header("Location: "https//www.tuosito.ext/".$_SERVER['PHP_SELF']."") ;
    exit ; } 
    Mi potresti dare qualche delucidazione in merito?
    Come faccio ad impostare una connessione protetta?

    Grazie per i tuoi pareri e consigli

  4. #4
    Allora, questa è la mia opinione in merito alla questione Login Sicuro. E' solo la mia personale (e nemmeno troppo elevata) esperienza e quello che mi fa pensare, nulla di più. Se avete un'opinione diversa siete liberi di cazziarmi, ma vorrei il motivo preciso, non un "Stai dicendo una manica di #####" e basta.

    Intro

    IMHO, devi un po' vedere il "livello" di sicurezza e di accesso che è necessario. Mi spiego meglio, potrebbero semplicemente volere una pagina per l'inserimento di news che però sia accessibile da più persone, anche con la stessa password (che in termini di security è uguale a 0), tuttavia, se si tratta si un azienda con due o tre persone che devono accedere, non credo che valga la pena di creare un intero sistema di autenticazione con controlli se un utente è già loggato o meno.
    Allo stesso tempo, se invece le pagina effettua delle operazioni delicate e c'è la necessità di sapere chi fa cosa, e di avere, quindi, un capro espiatorio in caso di disastro, un sistema completo di accesso esclusivo è necessario.
    Bisogna, prima di tutto vedere a cosa ti serve, dato che anche il tuo sistema è validissimo, per casi che non richiedono sicurezza elevata.

    Login Base
    Come login di Base, quello che hai scritto tu va benissimo. Quello che manca, anche se suppongo (e spero) tu faccia già, è un controllo per prevenire SQL Injection, che, anche se è un controllo base, è un passo necessario.

    Un esempio su come prevenire SQL Injection:

    Codice PHP:
    $username str_replace("'"""$_POST['username']); //Questo ovviamente presuppone che non ci siano nomi utente tipo "Giuseppe d'Arrigo"
    $password SHA1($_POST['password']);
    $query "SELECT * FROM Utente WHERE username LIKE '$username' AND password LIKE '$password'";
    ... 
    Login Esclusivo
    Il login esclusivo, necessita di implementare un modo per controllare se l'utente è già autenticato. Questo si fa facilmente, inserendo un campo Logged VARCHAR(16) DEFAULT NULL nella tabella Utente, al momento del login, dopo aver ottenuto i dati dell'utente con una query tipo quella sopra, si controllerà che Logged == NULL, in caso positivo, si aggiorna la tabella con Logged = IP_del_Client, altrimenti si fa prensente che l'utente è già autenticato presso il sistema (così uno può accorgersi se gli hanno bucato l'account).
    A questo punto, si può decidere se far sloggare l'utente precedente e far loggare quello nuovo, oppure se bloccare il secondo, lasciando il primo loggato. Questo dipende dal tipo di sistema, per esempio in un azienda dove uno può accedere da più di un PC, potrebbe far comodo un sistema di logout del primo utente (per dire, uno chiude il browser da una parte senza fare logout, poi fa login da un'altra parte). Allo stesso tempo, in un servizio di intranet può essere più comodo controllare anche gli accessi.
    Il secondo punto da controllare e la session expire che, essendo gestita dal DB, deve avere una data di scadenza.
    Per questo si utilizza un campo Expire TIMESTAMP DAFAULT NULL. Quando l'utente richiede una pagina Privata il campo Expire verrà aggiornato a NOW() + durata della session. Inoltre, nel momento del login si controllerà se l'utente è autenticato (Logged != NULL) e se Expire > NOW(), se uno di questi controlli fallisce allora l'utente può accedere.

    In sostanza (metti che il codice sia successivo a quello soprapostato):
    Codice PHP:
    $result mysql_query($query$db);

    $user mysql_fetch_assoc($result);

    if(!
    $user)
    {
       echo 
    "Nome utente o Password errati";
    }
    else
    {
       if(
    $user['Logged'] != null)
       {
          
    $ip get_IP(); //Questa non è una funzione standard, ma una funzione che, metti, ho scritto per ottenere l'IP del client che effettua la richiesta dal suo USER-AGENT o dall'header della richiesta.
          
    if($user['Logged'] == $ip)
          {
             
    //L'utente era già autenticato da questo client, probabilmente è scaduta la sessione del Web Server e l'utente si è dovuto riautenticare
             //Rimetti i dati dell'utente in sessione ed aggiorna il campo Expire a NOW()
          
    }
          else
         {
             
    //L'utente non era autenticato su questa macchina
             
    if($user['Expire'] < mktime())
             {
                 
    //La sessione precedente è scaduta, l'utente può autenticarsi
                 //Metti i dati dell'utente in sessione ed aggiorna Expire a NOW e Logged a $ip
             
    }
             else
             {
                 
    //La sessione è ancora in uso da un altro utente
                 //A seconda di quello che scegli, bloccalo o aggiorna il DB con i nuovi dati
             
    }
          }
       }
       else
       {
           
    //Non c'era utente autenticato
           //Metti i dati dell'utente in sessione ed aggiorna il DB
       
    }

    In Ultimus
    In ultimo, devo quotare carlo2002, inserisci SSL nel tuo sito, per criptare la connessione. Magari, non ti interesserà di criptare tutto il sito, ma solo la pagina di LOGIN in modo che i dati vengano trasmessi in maniera sicura.

    Codice PHP:
    <form action="https://www.tuosito.it/scripts/actor.login.php" method="POST">
       


          
    Username : <input type="text" name="username" />
       </
    p>
       


          
    Password : <input type="password" name="password" />
       </
    p>
       


          <
    input type="submit" value="Accedi" />
       </
    p>
    </
    form
    Alla fine di actor.login.php ci sarà:

    Codice PHP:
    header("Location: [url]http://www.tuosito.it/index.php[/url]");
    exit; 

  5. #5
    Originariamente inviato da spiadadda
    Non ho ben capito perchè fai questo. Quindi tu alla variabile di sessione che poi ti permette di effettuare il controllo assegni un valore univoco a caso?
    Beh, alla variabile di sessione è assegnato un valore univoco a caso, di solito lo fa il Web Server, ma all'occorrenza lo puoi fare anche tu

    @carlo2002
    Considera che non è facilissimo che ci siano due sessioni con lo stesso ID anche se lo lasci generare dal Web Server. È una cosa che capita solo in casi estremi e comunque remotissimi.

    Mi potresti dare qualche delucidazione in merito?
    Come faccio ad impostare una connessione protetta?
    Dunque, SSL è un sistema di criptazione che necessita di installare sul server un certificato SSL (appunto) ed un Programma che si occupi di gestire la cosa. Con Apache si tratta del modulo mod_ssl, più OpenSSL (un programma opensource per la gestione di SSL), che una volta installati permette di assicurare una comunicazione sicura tra client e server semplicemente puntando il browser su https, anziché http.

    Per una documentazione più completa ti conviene cercare in internet (io non sono proprio un esperto di ciò)

  6. #6
    Utente di HTML.it L'avatar di carlo2002
    Registrato dal
    Jun 2002
    Messaggi
    2,746
    Originariamente inviato da artorius
    Beh, alla variabile di sessione è assegnato un valore univoco a caso, di solito lo fa il Web Server, ma all'occorrenza lo puoi fare anche tu

    @carlo2002
    Considera che non è facilissimo che ci siano due sessioni con lo stesso ID anche se lo lasci generare dal Web Server. È una cosa che capita solo in casi estremi e comunque remotissimi.
    Si, in effetti il mio è un eccesso di zelo
    Errare humanum est, perseverare ovest

  7. #7
    Utente di HTML.it L'avatar di carlo2002
    Registrato dal
    Jun 2002
    Messaggi
    2,746
    Originariamente inviato da spiadadda
    Mi potresti dare qualche delucidazione in merito?
    Come faccio ad impostare una connessione protetta?

    Grazie per i tuoi pareri e consigli
    Ora non so se lavori su un tuo server, io mi rivolgo ad un servizio di hosting e la connessione protetta me la forniscono loro. In rapporto al tipo di contratto può essere già inclusa oppure deve essere richiesta in più con relativo pagamento. Dipende dall'hosting
    Errare humanum est, perseverare ovest

  8. #8
    Utilizzo uservizio di hosting quindi devo chiedere a loro se è compreso nel servizio.

    Mi studio un pò i consigli dati fino ora per fare delle domande in merito

    Grazie comunque a tutti

  9. #9
    Utente di HTML.it L'avatar di carlo2002
    Registrato dal
    Jun 2002
    Messaggi
    2,746
    Originariamente inviato da artorius
    tuttavia, se si tratta si un azienda con due o tre persone che devono accedere, non credo che valga la pena di creare un intero sistema di autenticazione con controlli se un utente è già loggato o meno.
    In effetti potrebbe sembrare eccessivo ma le statistiche dicono che la maggior parte delle violazioni vengono effettuate dall'interno di una azienda quindi se devi fornire un prodotto è meglio farlo subito seriamente. Non dimentichiamo che ci sono anche delle leggi sul lavoro, e quindi l'applicazione deve essere pensata non per controllare l'operato del lavoratore ma bensì per difendere l'azienda da eventuali illeciti (art.4 dello Statuto dei Lavoratori).

    La pensavo leggera anch'io e tutto funziona finchè le cose vanno bene, ma se in azienda incominciano gli scazzi meglio essersi premuniti in anticipo.

    Quindi il mio parere (imho) è di fare un buon lavoro all'inizio sviluppando un sistema di login solido che poi ti rimane e puoi facilmente riutilizzarlo per altre occasioni.
    Errare humanum est, perseverare ovest

  10. #10
    Sono d'accordo, ma quando uno ti chiede una cosa, ed un altro un'altra, ovviamente da fare subito e bene, cominci a chiederti "cos'ho di sbagliato a volere il tempo di fare le cose?".

    Comunque, mi è capitato di dover fare un servizio di un file privato con una funzione che non usava il DB, mi sembrava un po' eccessivo mettere su un DB con una tabella per quello. Io gli ho proposto la Basic Authentication di Apache, ma ho ottenuto come unico risultato urla di terrore e fuga disordinata: se la gente è abituata ad una login con la formettina username + password + pulsante, gli viene un colpo apoplettico se provi a mettergli una cosa diversa come la finestra di prompt di Apache.
    A questo punto, ho fatto una pagina con i parametri username e password direttamente nel codice (password non in chiaro, x chi mi hai preso? Joomla?) ed il controllo era bello che fatto, che per quello che serve è più che sufficiente.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.