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

    Problema di login con PDO

    Ciao a tutti,
    mi trovo alle prese con la creazione di un sistema di login utente, sviluppando tutto in locale non ho riscontrato nessun problema ma una volta trasferito tutto il lavoro lavoro sul server mi sono accorto che dopo la registrazione se vado ad effoture il login non mi permette di accedere con nome utente e pass.

    Vi posto il codice sperando che sia una cosa risolvibile.

    Grazize a tutti in anticipo.

    Form per l'accesso:
    codice:
    <form id="accesso" name="contact" method="post" action="autentica.php">
    <input id="username" type="text" name="user" value="" />   
    <input id="password" type="password" name="pass" value="" />
    <input type="submit" id="submit" value="LOGIN">
    </form>
    Autentica.php
    Codice PHP:
    <?php
    require_once "autenticazione/Utente.php";

    session_start();

    $_SESSION["user"] = new Utente($_POST["user"], $_POST["pass"]);

    $_SESSION["user"]->autentica();

    if (
    $_SESSION["user"]->isAutenticato()) {
        
    header("Location: /xxx/index.php");
    } else {
        
    header("Location: /xxx/index.php?loginFallito=1");
    }
    ?>
    autenticazione/Utente.php
    Codice PHP:
    <?php
    class Utente {
        
    /**
         *
         * @var string Il nome utente
         */
        
    private $nome;

        
    /**
         *
         * @var string La password, sia in chiaro che codificata
         */
        
    private $password;

        
    /**
         *
         * @var bool Lo stato di autenticazione dell'utente
         */
        
    private $autenticato;

        
    /**
         *
         * @var bool
         */
        
    private $passwordCrittata;

        
    /**
         *
         * @var array Contiene gli eventuali messaggi di errore in caso di
         * autenticazione fallita.
         */
        
    private $errori;

        public function 
    __construct($nome$password) {
            
    $this->nome $nome;
            
    $this->password $password;
            
    $this->autenticato false;
            
    $this->passwordCrittata false;
            
    $this->errori = array();
        }

        public function 
    autentica() {
            try {
                
    $db = new PDO("mysql:host=localhost;dbname=xxx",
                        
    "root",
                        
    "",
                        array(
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
                );

                
    $db->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);

                
    $sql sprintf("SELECT * FROM admin WHERE `nome` = '%s'"addslashes($this->nome));
                
    $comandoSQL $db->query($sql);

                
    $risultato $comandoSQL->fetch(PDO::FETCH_ASSOC);

                unset(
    $db);
            } catch (
    PDOException $e) {
                
    $this->errori[] = $e;
            }

            if (
    $risultato) {
                if (!
    $this->passwordCrittata) {
                    
    $this->password hash($risultato["algoritmo"], $this->passwordtrue);
                    
    $this->passwordCrittata true;
                }

                
    $this->autenticato $this->password == $risultato["password"];

                if (!
    $this->autenticato)
                    
    $this->errori[] = "Le password non corrispondono.";
            } else {
                
    $this->errori[] = "Utente non trovato.";
            }
        }

        public function 
    isAutenticato() {
            return 
    $this->autenticato;
        }

        public function  
    __toString() {
            return 
    $this->nome;
        }
    }
    ?>
    Questa è la query che uso per l'inserimento de dati
    Codice PHP:
    <?php
    try{

                   
    $sql "INSERT INTO  `admin` (`id`, `nome`, `password`)
                VALUES ( '
    $id', '$mail', SHA1('$pass'))";

                   
    //Preparo le strutture per contenere la query
                   
    $stmt $dbh->prepare($sql);

                   
    //Controllo se la query è andata a buon fine
                   
    if (! $stmt->execute() ) echo "[b]Errore nella query.[/b]";

               }
               
    //Nel caso in cui ci siano errori, li cattura nella variabile $myerror e li stampa 
               
    catch (PDOException $myerror)
               {
                       print 
    "Problemi nella connessione al database: 
    $myerror->getMessage() . "
    "
    ;
               }
    ?>

  2. #2
    in autentica.php usi istruzioni errate come $_SESSION["user"]->autentica(); poichè $_SESSION["user"] è una variabile di tipo session e non può certamente essere considerata una istanza di una classe!

  3. #3
    Originariamente inviato da Emulman
    in autentica.php usi istruzioni errate come $_SESSION["user"]->autentica(); poichè $_SESSION["user"] è una variabile di tipo session e non può certamente essere considerata una istanza di una classe!
    Grazie per la velocità

    quindi se cambio il codice così dovrebbe andare:

    Codice PHP:

    <?php
    require_once "autenticazione/Utente.php";

    session_start();

    $user = new Utente($_POST["user"], $_POST["pass"]);

    $user->autentica();

    if (
    $user->isAutenticato()) {
        
    header("Location: /xxx/index.php");
    } else {
        
    header("Location: /xxx/index.php?loginFallito=1");
    }
    ?>

  4. #4
    se hai definito un oggetto $user si!!!

  5. #5
    Una variabile di sessione può benissimo contenere l'istanza di una classe.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  6. #6
    Quindi dove pensi sia allocato il problema?

  7. #7
    Ti consiglio di cercare prima di isolare il problema stampando, magari con un semplice echo, le variabili, le query che esegui ed i vari risultati.
    In questo modo puoi verificare il "giro" che fa il codice e circoscrivere il problema.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  8. #8
    Ho verificato e il problema sembra trovarsi nella query che inserisce la password:

    Codice PHP:
    <?php

        
    if(isset($_POST['pass'])) {
            
    $pass addslashes(filter_var($_POST['pass'], FILTER_SANITIZE_STRING));
        }


        try{

            
    $sql "INSERT INTO  `admin` (`id`, `nome`, `password`)
            VALUES ( '
    $id', '$mail', SHA1('$pass'))";

            
    //Preparo le strutture per contenere la query
            
    $stmt $dbh->prepare($sql);

            
    //Controllo se la query è andata a buon fine
            
    if (! $stmt->execute() ) echo "[b]Errore nella query.[/b]";
        }
        
    //Nel caso in cui ci siano errori, li cattura nella variabile $myerror e li stampa 
        
    catch (PDOException $myerror)
        {
        print 
    "Problemi nella connessione al database: 
    $myerror->getMessage() . "
    "
    ;
        }
           
    ?>
    A quanto pare la pass non viene salvata correttamente, allora ho provato con un inserimento manuele e di fatto il sistema di login mi fa accedere senza problemi.

    Codice PHP:
    INSERT INTO  `admin` (`id`, `nome`, `password`) VALUES '50eec9f180946''simone86sp@gmail.com'UNHEX(SHA1('pandizenzero'))) 
    Ho provato a modificare lo script così:

    Codice PHP:
    <?php

        
    if(isset($_POST['pass'])) {
            
    $pass sha1($_POST['pass']);
        }


        try{

            
    $sql "INSERT INTO  `admin` (`id`, `nome`, `password`)
            VALUES ( '
    $id', '$mail', '$pass')";

            
    //Preparo le strutture per contenere la query
            
    $stmt $dbh->prepare($sql);

            
    //Controllo se la query è andata a buon fine
            
    if (! $stmt->execute() ) echo "[b]Errore nella query.[/b]";
        }
        
    //Nel caso in cui ci siano errori, li cattura nella variabile $myerror e li stampa 
        
    catch (PDOException $myerror)
        {
        print 
    "Problemi nella connessione al database: 
    $myerror->getMessage() . "
    "
    ;
        }
           
    ?>
    Purtroppo anche così non va, avete qualche suggerimento per salvare correttamente le pass con algoritmo sha1 inserendolo nella query?

    Grazie

  9. #9
    Prova a modificare la query così:

    Codice PHP:
    ...
    $sql "INSERT INTO  `admin` (id, nome, password) VALUES ( '$id', '$mail', SHA1('$pass'))"
    ... 
    inoltre è probabile che il campi id sia numerico per cui non ci vogliono gli apici:

    Codice PHP:
    ...
    $sql "INSERT INTO  `admin` (id, nome, password) VALUES ($id, '$mail', SHA1('$pass'))"
    ... 
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  10. #10
    Utente di HTML.it L'avatar di Fractals87
    Registrato dal
    Apr 2008
    Messaggi
    1,202
    Ciao,

    tu nell'inserimento dello user vai a codificare la password con l'algoritmo SHA1()
    INSERT INTO `admin` (`id`, `nome`, `password`) VALUES ( '$id', '$mail', SHA1('$pass'))

    Quando però vai a effettuare il controllo utilizzi la funzione hash() dove è necessario settare l'algoritmo.

    Ora, $risultato["algoritmo"] è un valore di default nel db? suppongo si siccome non vai a settarlo nell'insert.
    Sei sicuro che la stringa contenuto in esso sia proprio "sha1"?

    $this->password = hash($risultato["algoritmo"], $this->password, true);
    Che mestiere difficile.....essere da soli ancora di più

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.