2014-10-23 6 views
6

Mein Registrierungsskript akzeptiert das Passwort eines Benutzers und verwendet dann die PHP-Funktion password_hash, um das Passwort zu verschlüsseln, und speichert es in einer Datenbank. Wenn ich mich mit dem gerade erstellten Benutzer anmelde, erhalte ich den Fehler, der prüft, ob die Passwörter identisch sind oder nicht. In meinem Fall sind sie nicht. Was mache ich falsch, wenn ich im Login-Skript die Funktion password_verify aufruft?PHP password_hash(), password_verify()

REGISTER

if($_SERVER["REQUEST_METHOD"] == "POST"){ 
    function secure($data){ 
     $data = trim($data); 
     $data = stripslashes($data); 
     $data = htmlspecialchars($data); 
     return($data); 
    } 

    $p_num = secure($_POST["p_number"]); 
    $first_name = secure($_POST["first_name"]); 
    $last_name = secure($_POST["last_name"]); 
    $email = secure($_POST["email"]); 
    $password = secure($_POST["pw"]); 
    $verify_password = secure($_POST["pw_verify"]); 
    $program = secure($_POST["program"]); 
    $role = secure($_POST["role"]); 
    $logged_in = 0; 
    $registered = 0; 
    $image = "../images/profile_placeholder.png"; 

    if($password != $verify_password){ 
     echo "Nope. Passwords"; 
    } 
    else{ 
     $registered = 1; 
     $password = password_hash($password, PASSWORD_DEFAULT); 
     $insert = "INSERT INTO `$user_table`(`user_id`, `first_name`, `last_name`, `password`, `image`, `email`, `program`, `role`, `logged_in`, `registered`) VALUES('" .$p_num ."', '" .$first_name ."', '" .$last_name ."', '" .$password ."', '" .$image ."', '" .$email ."', '" .$program ."', '" .$role ."', '" .$logged_in ."', '" .$registered ."')"; 
     $query = mysqli_query($connect, $insert); 
     echo "Success!"; 
    } 
} 

LOGIN

if($_SERVER["REQUEST_METHOD"] == "POST"){ 
    $p_num = $_POST["username"]; 
    $pwd = $_POST["password"]; 

    $query = "SELECT * FROM `$user_table` WHERE `user_id` = '$p_num'"; 
    $result = mysqli_query($connect, $query); 
    while($row = mysqli_fetch_assoc($result)){ 
     $user_id = "{$row['user_id']}"; 
     $first_name = "{$row['first_name']}"; 
     $last_name = "{$row['last_name']}"; 
     $user_name = $first_name ." " .$last_name; 
     $password = "{$row['password']}"; 
     $image = "{$row['image']}"; 
     $email = "{$row['email']}"; 
     $program = "{$row['program']}"; 
     $role = "{$row['role']}"; 
     $status = "{$row['logged_in']}"; 
     $registered = "{$row['registered']}"; 
     if(($user_id == $p_num) && (password_verify($pwd, $password))){ 
      $_SESSION["id"] = $user_id; 
      $_SESSION["user"] = $user_name; 
      $_SESSION["program"] = $program; 
      $_SESSION["pass"] = $password; 
      $_SESSION["image"] = $image; 
      $_SESSION["email"] = $email; 
      $_SESSION["role"] = $role; 
      $_SESSION["status"] = $status; 
      $_SESSION["registered"] = $registered; 
      $loggedin = "UPDATE `$user_table` SET `logged_in` = 1 WHERE `user_id` = '$user_id'"; 
     } 
    var_dump($pwd); 
    var_dump($password); 
} 

Hier ist, was ich bekomme, wenn ich Var_dump tun:

string(1) "1" string(16) "$2y$10$0aysCso3b" 

So klar, werden die Passwörter nicht abgestimmt sind bekommen ihr. Im Registrierungsskript wird das Kennwort also gehashed und an die Datenbank gesendet. Wenn der Benutzer dann zur Anmeldung übergeht, prüft das Anmeldeskript das Kennwort, das der Benutzer eingegeben hat, um sich anzumelden, und prüft es anschließend anhand des Hash-Kennworts in der Datenbank mit password_verify. Das gehashte Kennwort akzeptiert das unverschlüsselte Kennwort jedoch nicht als Übereinstimmung. Was ich nicht verstehe, ist warum?

+0

Woher kommen '$ pwd' und' $ password' in Ihrem Login-Skript? –

+0

Hoppla, dachte ich kopiere alles. Es wurde der Frage hinzugefügt. –

+0

Hinweis: Sie sollten nach jedem Ihrer Header 'exit;' hinzufügen. Ie .: 'header (" Ort: ../pages/denied_login.php "); exit; ' –

Antwort

10

Hier ist, was ich für password_hash und password_verify verwenden. Probieren Sie es wie geschrieben aus, Sie können dann den Rest Ihres Codes hinzufügen, sobald Sie erfolgreich sind.

Ändern Sie die Tabellen- und Spaltennamen entsprechend.

N.B .: Dies ist eine grundlegende Einfügemethode. Ich schlage vor, dass Sie stattdessen prepared statements verwenden.

Hinweis: Die Kennwortspalte muss lang genug sein, um den Hash VARCHAR(255) aufzunehmen. Konsultieren Sie "Fußnoten".

INSERT Datei

<?php 
$DB_HOST = 'xxx'; 
$DB_USER = 'xxx'; 
$DB_PASS = 'xxx'; 
$DB_NAME = 'xxx'; 

$conn = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME); 
if($conn->connect_errno > 0) { 
die('Connection failed [' . $conn->connect_error . ']'); 
} 

$password = "rasmuslerdorf"; 
$first_name = "john"; 
$password = password_hash($password, PASSWORD_DEFAULT); 

$sql = "INSERT INTO users (`name`, `password`) VALUES ('" .$first_name ."', '" .$password ."')"; 

    $query = mysqli_query($conn, $sql); 
    if($query) 

{ 
    echo "Success!"; 
} 

else{ 
    // echo "Error"; 
    die('There was an error running the query [' . $conn->error . ']'); 
} 

LOGIN Datei

<?php 
// session_start(); 

$DB_HOST = 'xxx'; 
$DB_USER = 'xxx'; 
$DB_PASS = 'xxx'; 
$DB_NAME = 'xxx'; 

$conn = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME); 
if($conn->connect_errno > 0) { 
    die('Connection failed [' . $conn->connect_error . ']'); 
} 

$pwd = "rasmuslerdorf"; 
$first_name = "john"; 

//$sql = "SELECT * FROM users WHERE id = 1"; 

     $sql = "SELECT * FROM users WHERE name='$first_name'"; 
     $result = $conn->query($sql); 
     if ($result->num_rows === 1) { 
      $row = $result->fetch_array(MYSQLI_ASSOC); 
      if (password_verify($pwd, $row['password'])) { 

       //Password matches, so create the session 
       // $_SESSION['user'] = $row['user_id']; 
       // header("Location: http://www.example.com/logged_in.php"); 

echo "Match"; 

      }else{ 
       echo "The username or password do not match"; 
      } 

} 

mysqli_close($conn); 

Fußnoten:

Das Passwort Spalte lang sein sollte genug, um den Hash zu halten. 72 lang ist, was die Hash in Zeichenlänge erzeugt, aber der manuelle schlägt 255.

Referenz:

„Verwenden Sie den bcrypt Algorithmus (default ab PHP 5.5 Beachten Sie, dass diese Konstante sich im Laufe der Zeit ändert, wenn neue und stärkere Algorithmen zu PHP hinzugefügt werden.Aus diesem Grund kann sich die Länge des Ergebnisses aus der Verwendung dieser Kennung im Laufe der Zeit ändern.Es wird daher empfohlen, die Ergebnis in Daten Basisspalte, die mehr als 60 Zeichen umfassen kann (255 Zeichen wären eine gute Wahl)."

+2

Sie hatten Recht, die Datenbankfeldlänge überprüfen zu lassen. Es war nicht 255, das war es, was es kaputt machte. Vielen Dank, dass Sie mir geholfen haben, dies herauszufinden. Ich untersuche auch vorbereitete Aussagen, ich bin es gewohnt, SQL-Injektionen manuell zu verhindern, von denen ich bis vor kurzem noch nie etwas gehört hatte, von dem, was ich bisher gesehen habe, sind sie ziemlich direkt. Danke nochmal für die Hilfe. –

+1

@Robert Sie sind herzlich willkommen Robert, ich bin froh zu wissen, dass es gelöst wurde. * Cheers * :) –

+1

Warum verwenden Sie keine vorbereiteten Anweisungen? Es besteht immer die Gefahr, dass Ihr Code einfach in ein Projekt kopiert und die Variablen durch '$ _POST ['user']', etc. ersetzt werden. –

1

Freunde wie wir sind mit Ihren persönlichen Benutzernamen einloggen, also müssen wir holen Passwort/Daten aus der Datenbank unter Verwendung von Benutzername Nur

. Beispiel:

<?php 
    $connect = mysqli_connect($localhost, $username, $pwd, $database) or die("Opps some thing went wrong"); 

    if (isset($_POST['submit'])) { 
     extract($_POST); 

    // Get Old Password from Database which is having unique userName 
    $sqlQuery = mysqli_query($connect, "select * from loginTable where User='$username'"); 
    $res = mysqli_fetch_array($sqlQuery); 
    $current_password = $res['userPassword']; 

    if (password_verify($enteredPassword, $current_password)) { 
     /* If Password is valid!! */ 
     $_SESSION['id'] = $res['id']; 
     header("location: home.php"); 
    } 
    else { 
     /* If Invalid password Entered */ 
     $alt = "Login Failed! Wrong user ID or Password"; 
     header("location: index.php?m=$alt"); 
    } 
    } 
?> 

Es ist für mich arbeiten ... Ich hole Kennwort von der Datenbank und vergleiche mit eingegebenem Kennwort Using PHP API dh password_verify ($ eingetragenes Kennwort, $ aktuelles_passwort)

Verwandte Themen