Sponsor-Board.de

Normale Version: [PHP] password_hash & password_verify
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Moin,

hab ein Problem mit password_verify.. password_hash wird nach erfolgreicher Registrierung im DB-Feld 'password' zum dazugehörigen User erfolgreich abgelegt.

Allerdings kriege ich kein Match, wenn ich mich dann einloggen will..

Hier mal die PHP:

PHP-Code:
<?php
     
require('db.php');
     function 
redirect($DoDie true) {
        
header('Location: success.php');
        if (
$DoDie)
        die();
     }
     
session_start();
     if(isset(
$_SESSION['username'])) {
        
redirect();
    }
        
// If form submitted, insert values into the database.
        
if (isset($_POST['username'])){
            
$username stripslashes($_REQUEST['username']); // removes backslashes
            
$username mysqli_real_escape_string($con,$username); //escapes special characters in a string
            
$password stripslashes($_REQUEST['password']);
            
$password mysqli_real_escape_string($con,$password);
            
$hash_query "SELECT password FROM `user` WHERE username='$username'";
            
$hash_result mysqli_query($con,$hash_query) or die(mysql_error());
            
$ipaddress $_SERVER['REMOTE_ADDR'];

            
//Checking is user existing in the database or not
            
$query "SELECT * FROM `user` WHERE username='$username' and password='$password'";
            
$result mysqli_query($con,$query) or die(mysql_error());
            
$rows mysqli_num_rows($result);
            if(
$rows==1){
                if (
password_verify($password$hash_result)) {
                    
$_SESSION['username'] = $username;
                    
$trn_date date("Y-m-d H:i:s");
                    
$query "UPDATE `user` SET `ip` = '$ipaddress', `last_login` = '$trn_date' WHERE `username` = '$username'";
                    
$result mysqli_query($con,$query) or die(mysql_error());
                    
$rows mysqli_num_rows($result);
                    
header("Location: success.php"); // Redirect user to index.php
                
}
                else {
                    
header("Location: error.php");
                }
            }
            else {
                
header("Location: error.php");
            }
        }
        else {

     
?>


Vielleicht kann mir jemand helfen.

Moin Jerr0w,

Im oberen Teil fragst du nach dem Password des Users in der Datenbank.

PHP-Code:
$hash_query "SELECT password FROM `user` WHERE username='$username'"


Das hashed Passwort findest du dann in deiner Variabel "$hash_result".

Dies ist soweit korrekt.

Nun zum zweiten Teil.
Dort findet man einen Fehler im ersten Query.

PHP-Code:
$query "SELECT * FROM `user` WHERE username='$username' and password='$password'"

Da das Passwort in der Datenbank einen Hash ist kannst du nicht ein Passwort im Klartext damit vergleichen.

Deshalb kriegst du immer eine Fehlermeldung.

Eine Möglichkeit wäre zum Beispiel folgende.

PHP-Code:
$password_hash password_hash($passwordPASSWORD_DEFAULT);
$query "SELECT * FROM `user` WHERE username='$username' and password='$password_hash'"

Hi TwIXx,

wenn ich das Passwort erneut hashen lasse beim Login, funktioniert doch meine Verify-Funktion nicht mehr?

Soweit ich password_verify verstehe, wird das Plaintext-Passwort durch Eingabe ins Formular übergeben. Dieses wird dann durch die Funktion password_verify generell gehashed. Anschließend werden die beiden Hashes miteinander verglichen und wenn es ein Match gibt -> Login.

Falls ich das irgendwie falsch verstanden habe, bitte korrigieren Smile

Wäre es möglich, dass du dich bei mir mal in Telegram oder so meldest? ([Link: Registrierung erforderlich]) bin für jede Hilfe sehr dankbar. Smile
Hi Jerr0w,

Hast völlig recht Biggrin, man sollte jeweils den ganzen Eintrag Lesen. Nicht nur die ersten paar Zeilen.

Schreibe dich trotzdem Mal in Telegram an.

LG
TwIXx
Benutz einfach das Passwort nicht im SELECT_Query, weil du kannst auch über password_hash nicht mehr das selbe Ergebnis kriegen, da ein kombinierter String aus Hash und dem einmaligen Zufalls-Salt generiert wird.

Die Funktionen nehmen dir quasi die komplette Arbeit ab - du musst nur den Rückgabewert von password_verify nutzen, ansonstne nirgends das Passwort überprüfen oder so.

Also in Pseudocode:

Nicht

Code:
SELECT USER WHERE username = $username and password = $password

IF password_verify($result_of_select, $password_to_check): SUCCESS


sondern

Code:
SELECT USER WHERE username = $username

IF password_verify($result_of_select, $password_to_check): SUCCESS



Allgemein wäre z.B. nach "SELECT USER WHERE username = $username and password = $password_which_was_entered_as_hash" sofern du nur den Hash gespeichert hast eine weitere PW-Prüfung unnötig. Unter PHP wäre das aber eher das Gegenteil von best practices, weil man unter PHP die beiden von dir genannten Funktionen nutzen sollte (oder selber zufällige Salts nutzen, aber da nimmt einem PHP ja bereits die Arbeit ab).

Referenz-URLs