Fehler bei password verify php?
Ich habe ein Testprogramm geschrieben, in dem man ein Passwort eingibt, dass dann gehasht in einer Datenbank gespeichert wird. Wenn ich mit dem Passwort vergleiche kommt aber nicht true sondern false raus. Das ganze habe ich in WebFTP gemacht.
Als Ausgabe bekomme ich:
123456789 $2y$10$4TMgUO3xGJMCy5iZnd6Be.TBRkIO2Z55GGwgQ5oeToD.ryJZAvvte Richtig In Datenbank übertragen $2y$10$4TMgUO3xGJMCy5iZnd6Be.TBRkIO2Z55GGwgQ5oeToD.ryJZAvvte Falsch Richtig übertragen
Bedeutet das gehashte Passwort wurde richtig gespeichert, aber passwort verify hat beim zweiten mal false zurück gegeben.
Hier ist der php Teil dazu:
<?php
if (isset($_POST["start"])) {
$password = $_POST["password"];
$email = $_POST["email"];
echo $password . " ";
$passwordHash = password_hash($password, PASSWORD_DEFAULT);
echo $passwordHash . " ";
if (password_verify($password, $passwordHash)){
echo "Richtig ";
}else{
echo "Falsch ";
}
require_once "data.php"; //Hier wird die Datenbankverbindung gespeichert
$statement = $pdo->prepare("INSERT INTO tab (email, password) VALUES (?, ?)");
$statement->execute(array($email, $passwordHash));
if ($statement){
echo "In Datenbank übertragen ";
$sql = "SELECT * FROM tab WHERE email='$email'";
$user = $pdo->query($sql)->fetch();
$passwordTest = $user["password"];
echo $passwordTest . " ";
if (password_verify($password, $passwordTest)){
echo "Richtig ";
}else{
echo "Falsch ";
if ($passwordHash == $passwordTest){
echo "Richtig übertragen ";
}else{
echo "Falsch übertragen ";
}
}
die();
}else{
die("Es ist etwas schief gelaufen");
}
}
?>
3 Antworten
Vorweg: Ich kann dein Problem nicht reproduzieren.
Ein häufiger Grund, wenn ein Vergleich mittels password_verify fehlschlägt, liegt allerdings in intern unterschiedlich genutzten Zeichenkodierungen. Stelle daher sicher, dass du für die Datenkommunikation überall eine einheitliche Kodierung verwendest.
1) Gib dem Browser in dem HTML-Dokument, welches das Formular beinhaltet, eine Zeichenkodierung vor:
<meta charset="utf-8">
2) Deine Datenbank/-tabelle sollte die Daten in utf8mb4-Kodierung (= UTF-8) speichern.
3) Gib in deinem Connectionstring eine eindeutige Kodierung vor:
$connectionString = 'mysql:host=...;dbname=...;port=...;charset=utf8mb4';
Hi r0informatik,
also ich würde es so machen:
<?php
if (isset($_POST["start"])) {
$password = $_POST["password"];
$email = $_POST["email"];
echo htmlspecialchars($password, ENT_QUOTES) . " ";
$passwordHash = password_hash($password, PASSWORD_DEFAULT);
echo $passwordHash . " ";
if (password_verify($password, $passwordHash)) {
echo "Richtig ";
} else {
echo "Falsch ";
}
require_once "data.php";
try {
$statement = $pdo->prepare("INSERT INTO tab (email, password) VALUES (?, ?)");
$statement->execute(array($email, $passwordHash));
if ($statement) {
echo "In Datenbank übertragen ";
$statement = $pdo->prepare("SELECT * FROM tab WHERE email = ?");
$statement->execute(array($email));
$user = $statement->fetch();
if ($user) {
$passwordTest = $user["password"];
echo $passwordTest . " ";
if (password_verify($password, $passwordTest)) {
echo "Richtig ";
} else {
echo "Falsch ";
if ($passwordHash == $passwordTest) {
echo "Richtig übertragen ";
} else {
echo "Falsch übertragen ";
}
}
} else {
echo "Benutzer nicht gefunden ";
}
} else {
echo "Fehler beim Einfügen in die Datenbank ";
}
} catch (PDOException $e) {
echo "Datenbankfehler: " . $e->getMessage();
}
die();
}
?>
Viel Erfolg
Frage 1: Wofür ist das Zeichen "$" in PHP zu benutzen?
(a) Variablendeklaration
(b) Blockdefinition
Frage 2: Führt ein "$" in einem String zu einem Parsing-Fehler?
(a) Ja
(b) Nein
Frage 3: Muss man "$" in einem String durch "\" escapen?
(a) Nein
(b) Ja
Die Lösung:
a, a, b
Ein Debugger hätte dir das Problem aufgezeigt. Der Wert in deiner Variable wird bei "$" abgeschnitten.
Liebe Grüße :)
- Das $-Zeichen kennzeichnet Variablen. Sowohl bei einer Deklaration, als auch wenn man eine Variable für eine Operation anwenden möchte.
- Das $-Zeichen selbst führt nur bei einer String-Interpolation (also String-Ausdrücken mit doppelten Anführungszeichen oder Heredoc-Notation) zu einem Parsing-Fehler, wenn ihm weitere Token folgen, mit denen ein valider Variablenname gebildet werden könnte (d.h. der obige Hash könnte problemlos mit einem String-Ausdruck in doppelten Anführungszeichen ausgegeben werden). In dem Fall muss das $-Zeichen maskiert werden oder man nimmt es aus den Interpolationsausdruck heraus.
Der Wert in deiner Variable wird bei "$" abgeschnitten.
Nein, wird er nicht. Der String-Ausdruck ist konstant. Selbst wenn er Tokens enthielte, mit denen sich ein valider Variablenname bilden lassen könnte, würde eine solche Auswertung nicht geschehen.
Und wie löse ich das Problem damit?
Irgendwie muss ich ja die Variable trotzdem definieren