2016-09-30 1 views
0

Ich kann das nicht zur Arbeit bringen. Ich bin neu im Umgang mit vorbereiteten Aussagen, also bin ich 50/50 was ich mache.Hash-Passwort mit vorbereiteten Anweisungen erhalten

Nach der Registrierung wird das Passwort mit password_hash($pass,PASSWORD_DEFAULT)

Jetzt gehasht, ich versuche, meine Login-Seite zu bekommen, dies zu funktionieren, aber ich weiß nicht, wo/wie es schreiben mit den password_verify()

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

     $sql = "SELECT * FROM users WHERE BINARY username=? AND password=?"; 
      $stmt = $db->prepare($sql); 
       $stmt->bind_param("ss",$username,$password); 
       $stmt->execute(); 
       $result = $stmt->get_result(); 
       $num_rows = $result->num_rows; 

       if($num_rows == 1){ 

        $rows = $result->fetch_assoc(); 
        if(password_verify($password, $rows['password'])){ 
        $_SESSION['loggedin'] = $username; 
        $_SESSION['country'] = $rows['country']; 
        $_SESSION['email'] = $rows['email']; 
        $_SESSION['avatar'] = $rows['u_avatar']; 
        $_SESSION['is_gm'] = $rows['is_gm']; 
        $_SESSION['user_lvl'] = $rows['user_lvl']; 
        $_SESSION['totalposts'] = $rows['post_total']; 
        $_SESSION['totalcoins'] = $rows['coins_total']; 
        $_SESSION['totalvotes'] = $rows['vote_total']; 
        $_SESSION['secquest'] = $rows['sec_quest']; 
        $_SESSION['secanswer'] = $rows['sec_answer']; 
        $_SESSION['join_date'] = $rows['join_date']; 

        header("Location: /index.php"); 
        exit(); 
        } 
       } else { 
        echo "<p class='error_msg'>No accounts could be found with the given credentials.</p>"; 
       } 

       $stmt->free_result(); 
       $stmt->close(); 
       $db->close(); 

Ich würde davon ausgehen, dass das Passwort überprüfen würde vor if($num_rows == 1) aber wie gesagt, ich habe keine Ahnung. im Wesentlichen

+0

Sie können das Passwort aus der Datenbank nicht so auswählen. In der SELECT-Anweisung versuchen Sie, das Klartextkennwort mit dem Hashwert zu vergleichen. – Devon

+0

Wenn Sie Ihre andere Frage http://stackoverflow.com/q/39781691/ sehen, wo Sie md5 zum Speichern von Passwort-Hashes verwendet haben, wette ich, dass Ihre Passwortspalte nicht lang genug ist. Wenn es etwas <60 ist, versagt es hier still. Wenn ja, müssen Sie erneut mit neuen gespeicherten Hashes beginnen. Ich bin (ziemlich) zuversichtlich über diese "Antwort". Was ist der Wert einer gespeicherten Hash-BTW und Länge einschließlich der Länge der Passwortspalte? –

+0

Ich habe bereits die Gelegenheit genutzt, nachdem meine vorherige Frage beantwortet wurde und änderte die Länge auf 150, so kann es nicht sein. @ Fred-ii- – Synyster

Antwort

1

Ihre Anfrage ist:

SELECT * FROM users WHERE username=username AND password_hash=plain_text_password 

Dies ist nicht zur Arbeit gehen. Wenn Sie sich auf das PHP-Kennwort-Hashing verlassen, können Sie keinen Kennwortvergleich auf SQL-Ebene durchführen. Rufen Sie den Kennwort-Hash von der Datenbank ab, und führen Sie password_verify (das Kennwort ausschließen =?) In Ihren WHERE-Argumenten aus.

Verwandte Themen