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

    Collegare controllo password form a login

    Buongiorno/buonasera.

    Come da titolo, vorrei effettuare un controllo sulla password che viene registrata nel form, al momento del login. Siccome sono due file separati e ho usato la funzione password_hash(), come posso effettuare questa operazione? qui di seguito vi lascio i codici:

    login:

    Codice PHP:

       <?php
       
    if(isset($_POST) && ! empty($_POST)){   

     
    ?>

       <?php
       
    // info per collegamento al DB
       
    $server "127.0.0.1";
       
    $username "root";
       
    $password "";
       
    $database "tes";

       
    $usn $_POST['email'];
       
    $pass $_POST['password']; 

       
    // connessione al DB
       
    $conn mysqli_connect($server,$username,$password) or die("Connessione non riuscita");

       
    /* se il DB esiste, effettua la connessione
       altrimenti no */
      
    mysqli_select_db($conn,$database) or die("database non presente");

      
    /*controllo dei dati inseriti dall'utente nel form
        per verificare correttezza o esistenza dell'utente inserito*/
      
    $query "SELECT nome,cognome,telefono FROM clienti
            WHERE email = '
    $usn' AND password = '$pass'";

      
    $result mysqli_query($conn,$query) or die("errore");

      
    $num mysqli_num_rows($result);  // può avere valore 0 o 1

      
    if($num == 0)
         echo 
    "<p id='p1'>"."password o username errati"."</p>";
      else{ 
        
    $record mysqli_fetch_row($result);
        echo 
    "accesso effettuato! benvenuto ".$record[0]." ".$record[1];
    }
    }
       
    ?>
    form:
    Codice PHP:
    <?php
       
    if(isset($_POST) && ! empty($_POST)){   // esegue le operazioni solo se nelle caselle di input è stato
                                              // inserito qualcosa, per evitare messaggi di errori di "undefined index"

     
    ?>




    <?php

     
    function chkEmail($email)  // controlla correttezza email
    {
        
    // elimino spazi, "a capo" e altro alle estremità della stringa
        
    $email trim($email);

        
    // se la stringa è vuota sicuramente non è una mail
        
    if(!$email) {
            return 
    false;
        }

        
    // controllo che ci sia una sola @ nella stringa
        
    $num_at count(explode'@'$email )) - 1;
        if(
    $num_at != 1) {
            return 
    false;
        }

        
    // controllo la presenza di ulteriori caratteri "pericolosi":
        
    if(strpos($email,';') || strpos($email,',') || strpos($email,' ')) {
            return 
    false;
        }

        
    // la stringa rispetta il formato classico di una mail?
        
    if(!preg_match'/^[\w\.\-]+@\w+[\w\.\-]*?\.\w{1,4}$/'$email)) {
            return 
    false;
        }

        return 
    true;
    }



    // info per collegamento al DB
       
    $server "127.0.0.1";
       
    $username "root";
       
    $password "";
       
    $database "tes";

       
    // info utente 
       
    $nome =  $_POST['nome'];
       
    $cognome $_POST['cognome'];
       
    $dob $_POST['dob'];
       
    $gender $_POST['gender'];
       
    $telefono $_POST['numero_tel'];
       
    $residenza $_POST['residenza'];
       
    $citta $_POST['citta'];
       
    $provincia $_POST['provincia'];
       
    $cap $_POST['cap'];
       
    $email $_POST['email'];
       
    $pass $_POST['password'];

       
    // connessione al DB
            
    $conn mysqli_connect($server,$username,$password) or die("Connessione non riuscita");

    /* se il DB esiste, effettua la connessione
       altrimenti no */
        
    mysqli_select_db($conn,$database) or die("database non presente");

                
    // registrazione utente

        
    if(chkEmail($email)){


        
    $query "SELECT * FROM clienti                 
                    WHERE email = '
    $_POST[email]'";        // controllo se esiste già l'email inserita

        
    $result mysqli_query($conn,$query) or die("errore");

        
    $num mysqli_num_rows($result);    // può avere valore 0 o 1

        
    if($num == 1)
            die(
    "utente già esistente.");

        else {
            
                
    /* se non esiste lo inserisco */

            
    $hash password_hash($passPASSWORD_DEFAULT); // cifro la password
            
            
    $insert "INSERT INTO clienti (nome,cognome,residenza,email,password,sesso,DoB,telefono,citta,provincia,cap) 
                        VALUES (
                        '
    $nome', 
                        '
    $cognome',
                        '
    $residenza', 
                        '
    $email',
                          '
    $hash',
                           '
    $gender',
                           '
    $dob',
                          '
    $telefono',
                          '
    $citta',
                          '
    $provincia',
                          '
    $cap')";

             if(
    mysqli_query($conn,$insert))
                 echo 
    "ok";
             else
                 echo 
    "no";
         }
        }

        else
            die(
    "formato email non corretta");
    }
    ?>
    grazie per la vostra attenzione.

  2. #2
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Visto che hai usato la password_hash(), puoi usare la password_verify() per verifica.

    codice:
    $query = "SELECT nome,cognome,telefono,password FROM clienti WHERE email = '$usn'";
    ...
    $record = mysqli_fetch_assoc($result);
    if($record && password_verify($pass, $record['password'])){
       //login OK
    }
    PS: Se lo stai facendo solo per studio allora ok, se è per lavoro/roba da mettere online stai attento che sei a rischio sql injection
    Ultima modifica di boots; 06-06-2018 a 10:07

  3. #3
    ma quella parte di codice devo metterla nel login.php? oppure nel form.php?
    Comunque è per un esame, però mi hanno detto di aggiungere mysqli_real_escape_string() per evitare SQL injection, è così?

  4. #4
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Nel login.
    Esatto, le stringe vanno passate alla funzione di escape oppure devi usare i prepared statements

  5. #5
    Allora ho corretto così

    codice:
       <?php
       if(isset($_POST) && ! empty($_POST)){   
    
     ?>
    
       <?php
       // info per collegamento al DB
       $server = "127.0.0.1";
       $username = "root";
       $password = "";
       $database = "tes";
    
       // connessione al DB
       $conn = mysqli_connect($server,$username,$password) or die("Connessione non riuscita");
    
        $usn = mysqli_real_escape_string($conn,$_POST['email']);
        $pass = mysqli_real_escape_string($conn,$_POST['password']); 
    
        $hashed_pass = password_hash($pass, PASSWORD_DEFAULT);
    
       /* se il DB esiste, effettua la connessione
       altrimenti no */
      mysqli_select_db($conn,$database) or die("database non presente");
    
      /*controllo dei dati inseriti dall'utente nel form
        per verificare correttezza o esistenza dell'utente inserito*/
      $query = "SELECT nome,cognome,telefono,password FROM clienti
            WHERE email = '$usn'";
    
      $result = mysqli_query($conn,$query) or die("errore");
    
      $num = mysqli_num_rows($result);  // può avere valore 0 o 1
    
      $record = mysqli_fetch_assoc($result);
    
      if($num == 1){
    
        if($record && password_verify($hashed_pass, $record['password'])){
          echo "login OK";
        }
    
      }
      else
        echo "password o username errati";
    }
      /*if($num == 0)
         echo "<p id='p1'>"."password o username errati"."</p>";
      else{ 
        $record = mysqli_fetch_row($result);
        echo "accesso effettuato! benvenuto ".$record[0]." ".$record[1];
    }*/
       ?>
    però mi continua a dare password o username errati. Come risolvo?

  6. #6
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Non serve fare nuovamente l'hash. La funzione password_hash() restituisce, oltre all'hash, tutto ciò che serve per la verifica. Quindi ti basta fare:
    Codice PHP:
    $conn mysqli_connect($server,$username,$password) or die("Connessione non riuscita");

    $usn mysqli_real_escape_string($conn,$_POST['email']);
    $pass mysqli_real_escape_string($conn,$_POST['password']); 

    /* se il DB esiste, effettua la connessione altrimenti no */
    mysqli_select_db($conn,$database) or die("database non presente");

      
    /*controllo dei dati inseriti dall'utente nel form
        per verificare correttezza o esistenza dell'utente inserito*/
    $query "SELECT nome,cognome,telefono,password FROM clienti
            WHERE email = '
    $usn'";

    $result mysqli_query($conn,$query) or die("errore");
    $record mysqli_fetch_assoc($result);
    if(
    $record && password_verify($pass$record['password'])){
          echo 
    "login OK";


  7. #7
    allora, ho riprovato facendo così, ma mi da sempre errore (come messaggio di errore ho messo "accesso negato" nell' else). Sarà che devo rivedere il form, anche se secondo me non c'è nulla che non va.

  8. #8
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Io farei due prove:
    Lato login
    - fai un echo di $usn e $pass e vedi se corrispondono a quelle che hai effettivamente inserito
    - metti un print_r($record) prima del if($record && password_verify()) e vedi che record ti tira fuori

    Lato registrazione
    - fai un echo di $hash e vedi se è lo stesso di quello salvato nel database. Magari hai dato una dimensione più piccola per password, che ti viene troncato

  9. #9
    in effetti la password viene tagliata di 2 caratteri nel database. Invece per quanto riguarda il login è tutto in ordine, viene stampato ciò che digito, quindi il problema deve essere la troncatura della password. Per risolvere, aumento la dimensione della casella password nel database?

  10. #10
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Si ed ovviamente devi rigenerare le password.
    Stando php.net PASSWOD_DEFAULT usa l'algoritmo predefinito (in quel momento) di php.
    Se il tuo hash inizia con $2y$ allora è usato bcrypt che tira fuori una stringa di 60 caratteri.
    Tuttavia php.net consiglia una lunghezza nel database di 255 caratteri, nel caso con le nuove versioni di php si passi ad algoritmi che generino hash più lunghi
    Ultima modifica di boots; 06-06-2018 a 12:00

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