2016-05-06 10 views
0

Aus irgendeinem Grund ist Password_Verify false zurückgegeben, egal was. Ich habe eine var_dump auf den Hash, der aus der Datenbank zurückgegeben wird, und es ist korrekt (mit 60 Zeichen). Ich weiß, dass das eingegebene Passwort korrekt ist. Und ich weiß, dass diese genaue Methode funktioniert, bevor ich auf PDO umschalte (Von dem, was ich gelesen habe, ist PDO sicherer. Außerdem mag ich die Idee, parametrisierte Abfragen zu verwenden).Password_Verify gibt nach dem Wechsel zu PDO immer false zurück?

Sie können meinen alten Code sehen, der funktionierte (er ist auskommentiert). Was ist anders an dem von PDO zurückgegebenen Hash?

<?php 
    /* When we have all of the input, try to login */ 
    if(isset($_POST['id']) && isset($_POST['password'])){ 

     /* Connect to the database */ 
     //$dbHandle = new Database(); 
     //$dbHandle -> connect(); 

     /* Santitize input to prevent SQL Injection */ 
     //$password = $dbHandle -> sanitize($_POST['password']); 
     //$id  = $dbHandle -> sanitize($_POST['id']); 

     $password = $_POST['password']; 
     $id = $_POST['id']; 

     trim($password); 
     trim($id); 

     // Query the Database for the users info 
     $stmt = $dbHandle -> prepare("SELECT `password`, `admin`, `firstname`, `lastname` FROM users WHERE `id` = :id"); 
     $stmt -> bindParam(":id", $id, PDO::PARAM_INT); 
     $stmt -> execute(); 
     $result = $stmt -> fetch(PDO::FETCH_ASSOC); 

     //$result = $dbHandle -> query("SELECT `password`, `admin`, `firstname`, `lastname` FROM users WHERE `id`=$id") -> fetch_assoc(); 
     $hash = $result['password']; 

     echo($hash . "<br>"); 
     echo(var_dump($hash)); 
     echo($password); 
     echo(var_dump(password_verify($password, $hash))); 
     /* Check to see if the user entered the correct password */ 
     if(password_verify($password, $hash)){ 

      //Login 
      $_SESSION['loggedin'] = true; 
      $_SESSION['admin'] = $result['admin']; 
      $_SESSION['name']  = $result['firstname'] . ' ' . $result['lastname']; 

      /* Update "lastlogin" 
      ** Remember that SQL expects datetime's to be inside single quotes (to make it a string) 
      */ 
      $timestamp = date("Y-m-d h:i:s"); 
      $dbHandle -> query("UPDATE `users` SET `lastlogin`='$timestamp' WHERE `id`=$id"); 

      //Send user to home page 
      header('Location: home.php'); 

     } else { 
      echo(" 
       <p style='color:red;'>Wrong ID/Password</p> 
      "); 
     } 
    } 
?> 

Das Ergebnis all dieser echos und vardumps sind als

Ausgabe der Schrift folgt

enter image description here

+1

Wenn die '$ dbHandle -> sanitize()' die Rohwerte änderte und Sie diese geänderten Werte speicherten, können sie sich von denen der Rohdateneingabe unterscheiden, ohne dass die '$ dbHandle -> sanitize()' Methode angewendet wurde. Versuchen Sie, diese auch zu tun, sehen Sie, ob Passwörter und solche zusammenpassen. – Rasclatt

+0

'$ dbHandle -> sanitize ($ string)' Ruft nur mysqli_real_escape_string auf $ string. Aber ich werde das versuchen und meine Ergebnisse veröffentlichen. –

+0

Ja, versuchen Sie es, es kann es beheben. – Rasclatt

Antwort

1

Überprüfen Sie, ob

$dbHandle -> sanitize($_POST['password']);

und

$password = $_POST['password'];  
trim($password); 

produzieren genau die gleichen für Ihre Passwörter.

Wenn nicht: das ist das Problem, dem Sie gegenüberstehen. Hat nichts mit PDO zu tun, Sie haben möglicherweise die Passwörter verstümmelt, bevor Sie die Hashes speichern ...

Wenn sie sind: Der Code sollte nicht fehlschlagen, wenn Sie das richtige Passwort verwenden.

+0

Was ich getan habe, nur um die Login-Seite zu testen, war echo 'password_hash ($ password, PASSWORD_DEFAULT)'. Ich habe dann die Ausgabe kopiert und in das Feld "Passwort" der Datenbank eingefügt (via PHPMYADMIN). Dies funktionierte perfekt mit den mysqli-Klassen. Jetzt, wenn ich die Datenbank mit PDO abfrage, bekomme ich den gleichen Hash. Aber password_verify schlägt fehl –

+0

** versucht, Antwort zu verbessern, habe nicht den Ruf. Kann auch nicht herausfinden, wie man als Antwort markiert. Dies führte mich zur Lösung ** –

0

wie sich herausstellt, rief ich mysqli_real_escape_string($PASSWORD, $dbHandle) VOR dem Hashing das Passwort. Natürlich hat dies den Hashwert insgesamt verändert.

Ich löste dies durch erneutes Einfügen des Passwort-Hash in die Datenbank nach Umschalten auf PDO.

Das war kein PDO-Fehler.

Verwandte Themen