2017-04-11 3 views
0

Ich baue eine Registrierung und Login-Formular und ich möchte meine Benutzer Passwörter bei der Registrierung Hash und mein Hauptproblem an dieser Stelle ist, wie Sie die Abfrage schreiben, um die Passwörter zu aktualisieren Der Benutzer signiert seine E-Mail und gibt es zum ersten Mal. Ich möchte mysqli_insert_id() zur Abfrage hinzufügen, um die eindeutige ID für jeden Benutzer zu verfolgen.mysql Abfrage zu aktualisieren db mit Hash Passwörter

so habe ich Datenbank namens testdb mit users innerhalb.

mein Code funktioniert perfekt bis zu dem Moment, wenn Sie das Passwort abfragen und aktualisieren müssen.

Zuerst ich Hashing meine Passwörter

$password = $_POST['password']; 

$hashed_password = password_hash($password, PASSWORD_BCRYPT); 

$query = "UPDATE `users` SET `password` = '$hashed_password' WHERE id = " 

Wie Sie ich habe ein Problem mit meiner Anfrage sehen, die Passwörter in meiner DB aktualisieren soll.

Ich habe diesen Code bis zu diesem Punkt geschrieben, damit ich Hilfe brauche, um meine UPDATE Abfrage

if (array_key_exists("submit", $_POST)) { 

    // connect to our db 
    $link = mysqli_connect("localhost", "root", "", "secretdi"); 
    // check for connection 
    if (mysqli_connect_error()) { 
     die("Database Connection Error"); 
    } 

    $error = ""; 

    if (!$_POST['email']) { 
     $error .= "An email address is required<br>"; 
    } 

    if (!$_POST['password']) { 
     $error .= "A password is required<br>"; 
    } 

    if ($error != "") { 
     $error = "<p>There were error(s) in your form:</p>".$error; 
    } else { 

     $query = "SELECT id FROM `users` WHERE `email` = '".mysqli_real_escape_string($link, $_POST['email'])."' LIMIT 1"; 

     $results = mysqli_query($link, $query); 

     if (mysqli_num_rows($results) > 0) { 
      $error = "That email address is taken."; 
     } else { 

      $query = "INSERT INTO `users` (`email`, `password`) VALUES('".mysqli_real_escape_string($link, $_POST['email'])."','".mysqli_real_escape_string($link, $_POST['password'])."') "; 

      if (!mysqli_query($link,$query)) { 
       $error = "<p>Could not sign you up - please try again later</p>"; 
      } else { 

       $password = $_POST['password']; 

       $hashed_password = password_hash($password, PASSWORD_BCRYPT); 


       $query = "UPDATE `users` SET `password` = '$hashed_password' WHERE id = " 


       echo "Sign up successful"; 
      } 

     } 

    } 
+1

Warte, willst du das Passwort bei der Anmeldung haseln ?! Warum nicht bei der Registrierung? – Vini

+0

ja ich möchte sie bei der Registrierung Hash ich war im Begriff, meine Frage zu bearbeiten – Learno

+0

Sie Hash-Passwörter bei der Registrierung und überprüfen Sie das Hash-Passwort mit Eingabe-Passwort bei der Anmeldung. Ich denke du bist verwirrt – Akintunde007

Antwort

1

Sie sollten nie unter keinen Umständen gehen, speichern Sie das Passwort im Klartext.

Das bedeutet, dass Sie beim Registrieren des Benutzers das Kennwort sofort hashen und es im Hash-Format speichern sollten, wenn Sie die INSERT-Anweisung ausführen. Ihre aktuelle Logik speichert das Passwort im Klartext, und wenn die Registrierung erfolgreich ist, versuchen Sie, das Passwort zu aktualisieren, um das Hashed zu werden. Dies bedeutet, dass Sie im Falle eines Fehlers am Ende nur das Klartext-Passwort in Ihrer Datenbank haben, und so oder so, dass es zu einem bestimmten Zeitpunkt an einem bestimmten Punkt im Klartext für jeden Benutzer existiert, den wir nicht verwenden Ich will nicht.

Darüber hinaus dient die Update-Anweisung keinen anderen Zweck als ein paar zusätzliche Zeilen Code zu verschwenden.

So etwas sollte tun:

if (mysqli_num_rows($results) > 0) { 
    $error = "That email address is taken."; 
} else { 
    $password = $_POST['password']; 
    $hashed_password = password_hash($password, PASSWORD_BCRYPT); 

    $query = "INSERT INTO `users` (`email`, `password`) VALUES('".mysqli_real_escape_string($link, $_POST['email'])."','".$hashed_password."') "; 

    if (!mysqli_query($link,$query)) { 
     $error = "<p>Could not sign you up - please try again later</p>"; 
    } else { 
     echo "Sign up successful"; 
    } 
} 

Wenn Sie wirklich zu Ihrem Plan festhalten wollen, aber dann können Sie den Benutzer-ID für den Benutzer auswählen, die Sie gerade erstellt hat (zB durch die E-Mail-Kennung mit der ist hoffentlich einzigartig) und benutzt sie als solche, um den zu aktualisierenden Benutzer zu identifizieren. Bitte tu das nicht.

Hinweis: Ich empfehle, einen Blick auf mysqli'sprepared statements zu werfen, um ein höheres Maß an Sicherheit zu gewährleisten, anstatt einzelne Variablen zu umgehen.

+0

Sie sollten nie, unter keinen Umständen Passwörter entkommen –

+1

Ich verstehe Ihren Punkt danke – Learno

+0

@MasivuyeCokile ist es nicht, es ist richtig. Wenn Sie denken, dass es falsch ist, haben Sie das Recht zu erklären, warum, anstatt nur zu sagen, dass es falsch ist, da niemand weiß, wer Sie sind oder warum jemand Ihnen vertrauen sollte. Das einzige, was in dieser Antwort fehlt, ist die Verwendung von PDO und vorbereiteten Anweisungen, aber der Mechanismus hinter dem Passwort-Hashing ist vollständig korrekt. – Mjh