Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 24

Discussione: login e sicurezza

  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2008
    Messaggi
    14

    login e sicurezza

    Buongiorno a tutti,
    programmo ogni tanto in php e questo forum spesso mi ha dato una grande mano. Ne approfitto nuovamente. Vorrei capire, una volta per tutte, se è possibile realizzare una semplice pagina di login che sia sicura ed intaccabile.
    Finora ho utilizzato questa filosofia:

    PAGINA DI LOGIN

    <FORM METHOD="post">
    Nome: <INPUT TYPE="text" SIZE=50 NAME="User">


    Pwd: <INPUT TYPE="password" SIZE=50 NAME="Pwd">



    <INPUT TYPE="submit" NAME="submit" VALUE="Submit!">
    </FORM>

    <?php

    if (isset($_POST['User']))
    {

    session_start();
    $User = $_POST['User'];
    $Pwd = $_POST['Pwd'];

    $_SESSION['user'] = $_POST['User'];
    $_SESSION['password'] = $_POST['Pwd'];

    $db = mysql_connect('HOST', 'DB_USER, 'DB_PWD') or die ("<h1
    style='color:#FF0000'>Connessione non riuscita: </h1>" . mysql_error());

    mysql_select_db('NOME_DB);

    $query = "SELECT pwd FROM tab_utenti WHERE Nome = '$User'";

    $result = mysql_query($query);

    $name_row = mysql_fetch_row($result)

    if (!($name_row = mysql_fetch_row($result)) or ($Pwd<>$name_row[0]))
    {

    PWD ERRATA

    }
    Else
    {

    VAI ALLA HOME

    }
    }

    ?>

    Tutte le altre pagine hanno invece all’inizio queste righe:

    TUTTE LE ALTRE PAGINE

    <?php

    session_start();

    $User = $_SESSION['user'];
    $Pwd = $_SESSION['password'];

    $db = mysql_connect('HOST', 'DB_USER, 'DB_PWD') or die ("<h1
    style='color:#FF0000'>Connessione non riuscita: </h1>" . mysql_error());

    mysql_select_db('NOME_DB);

    $query = "SELECT pwd FROM tab_utenti WHERE Nome = '$User'";

    $result = mysql_query($query);

    $name_row = mysql_fetch_row($result)

    if (!($name_row = mysql_fetch_row($result)) or ($Pwd<>$name_row[0]))
    {

    PAGINA DI LOGIN

    }
    Else
    {

    PAGINA RICHIESTA

    }

    ?>


    Il tutto funziona perfettamente. Vorrei solo sapere se a livello di sicurezza il codice va bene perché:

    - Nel codice c’è l’utente e la password per l’accesso al database, ma essendo lato server questo non dovrebbe essere visibile ai malintenzionati. Corretto?
    - Il fatto che nella pagina di login passo l’user con il metodo post non dovrebbe rappresentare un problema. Giusto?
    - Il fatto che confronti la password inserita e memorizzata con SESSION, ogni pagina, con quella estratta dal database è corretto e sicuro?
    - Ci sono altri problemi per la sicurezza?

    Mi scuso per essermi dilungato e ringrazio chiunque vorrà rispondermi.
    Buona giornata

  2. #2
    - Nel codice c’è l’utente e la password per l’accesso al database, ma essendo lato server questo non dovrebbe essere visibile ai malintenzionati. Corretto? - Il fatto che nella pagina di login passo l’user con il metodo post non dovrebbe rappresentare un problema. Giusto? - Il fatto che confronti la password inserita e memorizzata con SESSION, ogni pagina, con quella estratta dal database è corretto e sicuro? - Ci sono altri problemi per la sicurezza?
    Mio parere personale:

    Personalmente io uso un form html (con indicato anche l'action oltre al method).

    Controllo che l'utente abbia inserito i due campi (isset di entrambi i campi nome_utente e password), controllo inoltre che i campi non siano vuoti.

    Esempio:
    Codice PHP:
    if (!isset($_POST['nome_utente']) or trim($_POST['nome_utente']) == "")
       {
          
    // nome_utente non esiste o è vuota
       
    }
    else
       {
          
    $nome_utente $_POST['nome_utente'];
       }

    if (!isset(
    $_POST['password']) or trim($_POST['password']) == "")
       {
          
    // password non esiste o è vuota
       
    }
    else
       {
          
    $password $_POST['password'];
       } 
    E questo è il primo passo.
    Il secondo passo è "pulire" quello che l'utente ha inserito, controllando che non abbia inserito caratteri che io programmatore ho deciso che non voglio per quei campi, usando preg_match.

    Codice PHP:
    // il pattern è un'espressione regolare
    $controllo_utente preg_match($pattern$nome_utente);
    if (
    $controllo_utente == 0)
       {
          
    // non vi sono caratteri speciali o non accettati
       
    }
    else
       {
          
    // ha inserito caratteri non accettati.
       

    - Fine prima parte, a dopo la seconda parte -

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2008
    Messaggi
    14
    Grazie 1000 goikiu,
    giustissimo, vanno inseriti i controlli che indichi.
    Come $pattern cosa usi??

    Attendo seconda parte:-)

  4. #4
    Utente di HTML.it L'avatar di jcsnake
    Registrato dal
    Jun 2010
    Messaggi
    629
    Ciao, noto che fai passare tramite sessione la password non so fino a che punto questo possa essere sicuro...ti consiglio invece di settare una variabile di sessione di tipo booleano del tipo autenticato si/no

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2008
    Messaggi
    14
    Quindi, se faccio il controllo user/pwd ed è corretto, setto la variabile di sessione a true, altrimenti false. Per cui, quando accedo alle altre pagine vado solo a verificare questa variabile. Se true, visualizzo la pagina, altrimenti torno alla pagina di login.
    Giusto?

    In tal modo però se qualcuno, senza fare il login, imposta questa variabile a true può accedere a tutte le pagine come se fosse autenticato.....o sbaglio???

  6. #6
    -- Parte Due --

    A livello teorico è errato salvare la password in una variabile di sessione e/o in un cookie e/o variabili get.

    Uno dei sistemi di login più sicuri è quello in cui l'utente inserisce il nome utente e la password, il sistema filtra (controlla quindi che i caratteri siano dentro un determinato range), cripta poi la password (esistono vari sistemi, md5, sha, crypt, etc), e fa un controllo sul database con quel nome utente e la password criptata (ovviamente a database devi avere solo la password criptata), se la query restituisce zero record allora l'utente ha toppato da qualche parte altrimenti se vi è un riscontro (e bada bene che se hai vari utenti può avere solo un riscrontro) ha inserito i dati giusti.

    Se ha inserito i dati giusti tu setti una tua variabile di sessione, a valore booleano (true/false), numerico (0/1) o come vuoi te.

    In tutte le altre pagine fai il controllo sulla variabile di sessione da te indicato che deve esistere ed avere un valore predeterminato.

    Oltre a questo tutti i campi dei form devono sempre essere filtrati (campi di versi possono avere regole diverse), una volta filtrati e resi innocui li fai passare per il tuo database. (Sistema di sicurezza per evitare SQL Injection e simili).

    Il problema si pone quando vuoi allungare il timeout standard delle sessioni (di norma circa 60 minuti). Esistono vari metodi, se hai bisogno del tasto remind me (checkbox), vai a creare un cookie nel computer dell'utente con una password di salto-login, ogni volta che l'utente cambia la password sul tuo sito questa mini-password cambia e viene cambiato il cookie con questa mini-password sul client.

    All'avvio della tua applicazione controlli poi se è presente o meno questo valore e fai un confronto (dopo aver controllato che non vi siano caratteri speciali come < > - _ etcetera.

    Esiste un'altro metodo (quello che uso io), io non ho bisogno del tasto ricordami, stò facendo un'applicazione web particolare, simile ad un cms, ma per fini privati, quindi stò usando prima di startare qualsiasi sessione (quindi prima del session_start(); ) il seguente comando:

    Codice PHP:
    session_set_cookie_params(0); 
    Questo comando dovrebbe far durare il timeout del cookie sino a che non chiude il browser. (e/o fa il logout).

    Detto questo, come ben saprai hai due generi di variabili non sicure, i valori in $_GET ed in $_POST.

    Normalmente tutto quello che inserisce l'utente va in $_POST , va filtrato e poi lo puoi passare a database.
    Inoltre io uso i $_GET anche nel definire le varie funzioni dell'applicazione, ovviamente faccio dei controlli.
    Se io faccio una pagina chiamata login_out.php
    in cui dico che una determinata variabile get può essere 1 se deve fare il login e 2 se deve fare il logout cosa vado a fare ?

    Codice PHP:
    if (isset($_GET['act']) and trim($_GET['act']) != ""// controllo che la variabile sia settata e non sia vuota
       
    {
           
    $azione trim($_GET['act']);
       }
    else
       {
          
    // Errore, mi segno un report nel database e sposto l'utente su un'altra pagina
        
    }

    switch (
    $azione)
    {
       case 
    1:
           
    // Azioni di controllo per il login
           
    break;
       case 
    2:
           
    // Azioni del logout
           
    break;
        default:
           
    // Segno un tentativo di hacking nel database e sposto l'utente su un'altra pagina
           
    break;

    quindi alla fine io controllo tutti i campi $_GET e tutti i campi $_POST
    una volta controllati questi mi sento abbastanza sicuro con la mia applicazione.

    Rispetto alla mia pattern io nei campi nome_utente e password accetto SOLO caratteri alfanumerici, seguente pattern:

    Codice PHP:
    if (preg_match('/[^a-zA-Z0-9]/'$_POST['username']) == 0)
    {
       
    // Contiene solo caratteri alfanumerici
                                                
       
    $username trim($_POST['username']);

    La prima parte dopo il preg_match sarebbe la pattern.

  7. #7
    Originariamente inviato da panix76
    Quindi, se faccio il controllo user/pwd ed è corretto, setto la variabile di sessione a true, altrimenti false. Per cui, quando accedo alle altre pagine vado solo a verificare questa variabile. Se true, visualizzo la pagina, altrimenti torno alla pagina di login.
    Giusto?

    In tal modo però se qualcuno, senza fare il login, imposta questa variabile a true può accedere a tutte le pagine come se fosse autenticato.....o sbaglio???
    Le sessioni hanno un'id univoco, quindi lui può crearsi sul sito X le variabili di sessione che vuole ma queste non valgono sul dominio Y (il tuo).

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2008
    Messaggi
    14
    Bhe, che dire, sic et simpliciter....grazie 1000, tutto chiaro, hai risposto anche a domande che ti avrei fatto, alla prossima

  9. #9
    Utente di HTML.it
    Registrato dal
    Aug 2008
    Messaggi
    14
    Scusa, ne approfitto ancora.
    Benissimo per l'utilizzo di un variabile di sessione true/false per verificare se un utente è autenticato o meno. Se però ho settaggi diversi per utenti divesi allora devo anche avere una variable con il nome dell'user. Per questa varibaile conviene usare session o cookie?? E cmq quando conviene usare l'uno o l'altro??

    Quando parli di filtrare intendi criptare oppure filtrare nel senso: controllarne i valori come nell'esempio sul GET che hai postato??????

    Ti faccio poi una domanda + generica: è possibile che qualche hacker o chicchesia riesca a leggere la parte in php delle pagine che creo?? cioè che riesca a leggere le pagine così come le ho create, compresa la parte in php interpretata dal server?? (ovviamente senza avere user e pwd del dominio)

    come sempre grazie

  10. #10
    Originariamente inviato da panix76
    Scusa, ne approfitto ancora.
    Benissimo per l'utilizzo di un variabile di sessione true/false per verificare se un utente è autenticato o meno. Se però ho settaggi diversi per utenti divesi allora devo anche avere una variable con il nome dell'user. Per questa varibaile conviene usare session o cookie?? E cmq quando conviene usare l'uno o l'altro??

    Quando parli di filtrare intendi criptare oppure filtrare nel senso: controllarne i valori come nell'esempio sul GET che hai postato??????

    Ti faccio poi una domanda + generica: è possibile che qualche hacker o chicchesia riesca a leggere la parte in php delle pagine che creo?? cioè che riesca a leggere le pagine così come le ho create, compresa la parte in php interpretata dal server?? (ovviamente senza avere user e pwd del dominio)

    come sempre grazie
    Io di solito mi salvo l'id dell'user in una variabile $_SESSION se lo ritengo necessario, poi nel database ho il riferimento id_user -> nome_utente

    Io non uso mai i cookie, di solito uso le sessioni, per come gestisco io le mie applicazioni varie di solito non arrivo ad usare più di tre o quattro variabili di sessione per volta, poi dipende in parte anche da cosa devi fare con la tua applicazione/script.

    Filtrare.. intendo controllare con il preg_match oppure trasformare tutti i caratteri speciali che consenti (come nei forum) da carattere speciale alla loro entità html (come le lettere accentate).

    Per l'ultima domanda non ho una risposta sicura, a livello teorico dovresti provare ad includere nel tuo script php in locale (presupponendo che tu abbia installato un server web+php in locale) una pagina del tuo sito online e vedere se in qualche modo riesci a stampare qualcosa. Non è detto che tu riesca ad includere, forse dipende pure da altri fattori, per questo problema dovresti attendere la risposta di altri utenti e/o integrare con altri informazioni reperite sul web.

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 © 2026 vBulletin Solutions, Inc. All rights reserved.