• User Attivo

    Primi esperimenti per login utenti

    Ciao a tutti conosco da un po' di tempo il php e adesso sto cercando di applicarlo a mysql per una gestione dei login e registrazioni. Ho iniziato a fare qualche prova per il login, premetto che non sono andato a guardarmi come si fa o a copiare cose già fatte, quindi potrei aver fatto una cosa di bassissimo livello. Però per incominciare ho voluto provare a ragionarci su un po' per capire meglio, poi se esistono degli algoritmi migliori li vado a guardare. Per adesso non ho ancora considerato la sicurezza. vi posto il codice delle pagine che ho fatto di prova:

    Pagina di login:

    <html>
    <body>
    <form method="post" action="accesso.php">
      <label>Utente:
      <input name="utente" type="text" id="utente" maxlength="20" />
      </label>
      <p>Password:<label>
        <input name="pass" type="password" id="pass" maxlength="20" />
        </label>
      </p>
      <p>
        <label>
        <input type="submit" name="Submit" value="Invia" />
        </label>
      </p>
    </form>
    </body>
    </html>
    ```Pagina di accesso:
    
    

    <?php
    $utente=$_POST['utente'];
    $pass=$_POST['pass'];
    $db_host = "localhost";
    $db_user = "root";
    $db_password = "";
    $db_name = "database";

    $db = mysql_connect($db_host, $db_user, $db_password);
    if (! $db)
    echo "Errore durante la connessiona la database.";

    mysql_select_db($db_name) or exit ("errore durante la selezione del database");

    $sqlcmd = "SELECT * ";
    $sqlcmd .= "FROM utenti ";
    $sqlcmd .="WHERE user='$utente' AND pass='$pass' ";
    $risultato = mysql_query( $sqlcmd );
    if (! $risultato)
    exit ("errore nell'interrogazione: $sqlcmd");
    if (mysql_num_rows ($risultato)==0)
    {
    exit ("Utente o Password errati");
    $accesso="no";
    }
    else
    $accesso="ok";

    session_start();

    $_SESSION['accesso']=$accesso;

    ?>

    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <title>Documento senza titolo</title>
    </head>
    <body>
    <a href="pagina1.php"> pagina 1 </a>
    </body>
    </html>

    
    

    <?php
    session_start();
    $accesso=$_SESSION['accesso'];
    if ($accesso!="ok")
    exit ("Accesso non effettuato");
    ?>

    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <title>Documento senza titolo</title>
    </head>
    <body>
    Pagina visibile
    <br />
    <a href="logout.php">logout</a>
    </body>
    </html>

    <?php
    session_start();
    session_destroy();
    ?>
    <html>
    sessione terminata
    </html>

    Grazie

  • User Attivo

    La prima domanda che mi sorge è:
    Se non chiudo la connessione al database nella pagina accesso, quando passo alla pagina1 la connessione rimane aperta o la devo rifare? Per ora la chiudo ad ogni pagina e la riapro la pagina dopo


  • ModSenior

    La connessione va fatta in ogni pagina quindi conviene fare un file di configurazione ed includerlo in tutte le pagine

    per quanto riguarda lo script sarebbe più corretto scrivere:
    al posto di :
    [php]$sqlcmd .="WHERE user='$utente' AND pass='$pass' ";[/php]
    questo:
    [php]$sqlcmd .="WHERE user='$_POST[utente]' AND pass='$_POST[pass]' ";[/php]

    cosi eviti anche problemi con le impostazioni dei server


  • User

    attento devi filtrare gli imput seno è automatica una sqlinjection!


  • ModSenior

    @GreyFox said:

    attento devi filtrare gli imput seno è automatica una sqlinjection!

    ha scritto che per adesso tralasciava la sicurezza...


  • User Attivo

    @GreyFox said:

    attento devi filtrare gli imput seno è automatica una sqlinjection!

    Adesso cerco di ottimizare anche la sicurezza, puoi spiegarmi meglio? grazie


  • ModSenior

    Per la sicurezza devi filtrare i simboli come ' e " che posso modificarti la query

    puoi usare la funzione addslashes per aggiugnere gli \ davanti a questi simboli e quindi evitare questi codici dannosi


  • User Attivo

    puoi farmi un esempio? grazie


  • ModSenior

    Link alla guida ufficiale del php:
    it2.php.net/addslashes


  • User Attivo

    grazie appena ho tempo gli do un'occhiata! :ciauz:


  • User

    attento fai anche un filtraggio per simboli come % < > ' " * e nella pagina stessa che interroga il db perche senno possono essere bypassati editando una richiesta http manualmente...inoltre per evitare proxy o spammer utilizza o le lettere delle immagini (come quella per registrarti qui) oppure un'applet in java che prenda l'ip privato del visitatore ...

    un esempio di funzione per validare un campo puo essere:

    [php]
    function quote_smart($value)
    {

    if (get_magic_quotes_gpc()) {
    $value = stripslashes($value);
    }

    if (!is_numeric($value)) {
    $value = "'" . mysql_real_escape_string($value) . "'";
    }
    return $value;
    }
    [/php]


  • User Attivo

    @GreyFox said:

    attento devi filtrare gli imput seno è automatica una sqlinjection!

    Ho approfondito l'argomento e una sqlinjection è molto pericolosa quanto semplice da fare, quindi è indispensabile metterla fuori uso. Adesso vedo cosa mi avete consigliato di fare e provo a sistemarlo

    @GreyFox said:

    attento fai anche un filtraggio per simboli come % < > ' " * e nella pagina stessa che interroga il db perche senno possono essere bypassati editando una richiesta http manualmente.

    Come faccio?

    @GreyFox said:

    inoltre per evitare proxy o spammer utilizza o le lettere delle immagini (come quella per registrarti qui) oppure un'applet in java che prenda l'ip privato del visitatore

    A questo penserò quando preparo la pagina per le registrazioni.


  • User Attivo

    Al termine del lavoro posto il codice ben commentato di tutte le pagine. Così da poter essere utilizzata da tutti coloro che vogliono una sezione privata nel proprio sito.


  • User Attivo

    @Thedarkita said:

    La connessione va fatta in ogni pagina quindi conviene fare un file di configurazione ed includerlo in tutte le pagine

    per quanto riguarda lo script sarebbe più corretto scrivere:
    al posto di :
    [php]$sqlcmd .="WHERE user='$utente' AND pass='$pass' ";[/php]questo:
    [php]$sqlcmd .="WHERE user='$_POST[utente]' AND pass='$_POST[pass]' ";[/php]
    cosi eviti anche problemi con le impostazioni dei server

    Ho fatto il file config.php che includo in tutte le pagine, per la query non ho capito la differenza...


  • User Attivo

    Ho aggiunto il filtro addslashes per evitare la sqlinjection e in effetti funziona, riporto il codice completo della pagina accesso:

    [php]
    <?php
    $utente=$_POST['utente'];
    $pass=$_POST['pass']; // ricevo i dati dal form di login
    $utente= addslashes ($utente);
    $pass= addslashes ($pass); //filtraggio utente e pass per evitare sqlinjection

    include 'configdb.php';

    $sqlcmd = "SELECT * ";
    $sqlcmd .= "FROM utenti ";
    $sqlcmd .="WHERE user='$utente' AND pass='$pass' "; //select per ricerca dell'user & pass all'interno della tabella
    $risultato = mysql_query( $sqlcmd ); // invio query al db
    if (! $risultato) //controllo interrogazione database
    exit ("errore nell'interrogazione: $sqlcmd");

    if (mysql_num_rows ($risultato)==0) //controllo presenza user e pass nella tabella
    {
    exit ("Utente o Password errati");
    $accesso="no"; //accesso non effettuato
    }
    else
    $accesso="ok"; //accesso effettuato

    session_start();
    $_SESSION['accesso']=$accesso; //salva lo stato di accesso per le seguenti pagine della sessione e il nome utente e pass
    $_SESSION['utente']=$utente;
    $_SESSION['pass']=$pass;

    mysql_close($db);
    ?>
    [/php]


  • Consiglio Direttivo

    Ciao drimmy
    Dato che stai iniziando a parlare di sicurezza allora non dimenticare di criptare la password con md5 😉


  • Moderatore

    sha1 anche 🙂

    se vogliamo rimanere nel ragionamento di criptazione 🙂


  • User Attivo

    ciao, quando applicherò il lavoro sperimentale che sto facendo ad un sito vero e proprio penso che avrò a disposizione il certificato SSL, c'è qualcosa da fare nella programmazione per quanto riguarda SSL? come criptazione password se creo un algoritmo mio di criptazione? tipo moltiplico per 5,435 (un numero a caso) quando vado a inserire la pass nel db e, quando la vado a leggere, divido per lo stesso numero.


  • ModSenior

    le codifiche md5 e sha1 sono irreversibili e quindi dovrebbero essere più sicure...

    per quanto riguarda il certificato negli script non devi fare niente