PHP password_verify () funktionniert nicht

Wolly300

Lieutenant
Registriert
Mai 2014
Beiträge
514
Hallo Community,

ich bau gerade meine eigene Webseite und habe das Problem das password_verify nicht geht

Habe in der DB den Hash "$2y$10$fOdu1SF/OsrF3TxRkUJwieddX3hJQGegFFwr34yvRyPVBXyvVWM/O1" von dem Passwort 123.

Diesen Hash lasse ich mir per echo vor dem verwenden in verify ausgeben und dieser ist immer richtig. auf die Einngabe 123 wird immer richtig angezeigt. Trotzdem bekomme ich einen FALSE Wert raus.

Was kann ich tun.

Danke für eure Hilfe.

Hier Noch der Code:

<?php

echo "<div style='background-color:white'>";

echo "</div>";
session_start();
$pdo = new PDO('mysql:host=127.0.0.1;dbname=login', 'root', '');

if(isset($_POST['login'])) {

$email = $_POST['email'];
$passwort = $_POST['passwort'];

$statement = $pdo->prepare("SELECT * FROM `login-stream` WHERE `email` = '".$email."';");
$result = $statement->execute(array('email' => $email));
$user = $statement->fetch();

//Überprüfung des Passwo;rts
//$pwdb = $user[2];

echo "PWDB=";
echo $user[2];
echo $passwort;

$überprüfung = password_verify ($passwort, $user[2]); //Fehler

if ($überprüfung == null) {
echo "P";
} else {
echo "!";
}

if ($user != null && $überprüfung == TRUE)
{
echo "<div style='background-color:white'>";
echo "Ich bin richtig!!!";
echo "</div>";


$_SESSION ('userid', $user ['id']);


setcookie ('userid', $user ['id'], time()+60*60*24*31);

echo "<html>";
echo "<meta hhtp-equiv='refresh' content='3; URL=http:127.0.0.1/html/2.Seite.php'/>";
echo "</html>";

exit();

} else {
echo "<div style='background-color:white'>";
echo "ELSE";
echo "</div>";
$errorMessage = "E-Mail oder Passwort war ungültig<br>";
}
}
 
Zuletzt bearbeitet:
Versuche mal doppelte Hochkommata durch einfache im dementsprechenden Codeabschnitt zu ersetzen.

Ansonsten den Code selbst posten.

LG
 
Die Ursache deines Fehlers kann ich so ohne weiteres nicht erkennen, hier aber ein paar andere Tips:

- Löblich, dass du für die Datenbankabfrage ein Prepared Statement benutzt, leider funktioniert das so aber nicht. Die Idee von Prepared Statements ist, dass du beim prepare() noch nicht die echten Daten angibst, sondern sie durch Platzhalter ersetzt. Erst beim execute() werden die echten Daten dann an die Stelle der Platzhalter eingefügt. So, wie's da oben steht, baust du den Wert von $email schon beim prepare() in die SQL-Abfrage ein - und zwar ohne Sicherheitsmaßnahmen, so dass das Programm an dieser Stelle verwundbar für SQL-Injection ist. Richtig wäre es so:

PHP:
$statement = $pdo->prepare("SELECT * FROM `login-stream` WHERE `email` = :email");
$result = $statement->execute(array(':email' => $email));

- Die Abfrage if ($überprüfung == null) ist wenig sinnvoll, weil password_verify() immer true oder false zurückgibt. In PHP ist false == null und true != null, d.h. die Bedingung ist effektiv identisch zu if ($überprüfung == false), das würde ich dann aber auch so schreiben.
- Wann immer möglich, bietet es sich an, Vergleiche mit === statt mit == zu machen. == benutzt Type Juggling, dadurch gelten auch Werte verschiedener Typen unter Umständen als gleich (z.B.: 0 == false, [] == null, 1 == true, "a" == true). Das kann zu Fehlern führen, wenn es unbeabsichtigt passiert. === vermeidet das Problem, da es Werte exakt vergleicht.
- Du prüfst in Zeile 33, ob $user != null ist. Davor hast du aber schon auf $user[2] zugegriffen. Falls $user == null ist, wird an dieser Stelle schon ein Fehler geworfen und das Programm bricht ab. Danach muss also $user != null gelten, die Abfrage ist an dieser Stelle überflüssig.
- session_start() muss ausgeführt werden, bevor Ausgaben an den Browser geschickt werden. Nimm die obersten beiden echo-Befehle weg oder setz das session_start() darüber.
- $_SESSION ist keine Funktion, sondern eine (Array-)Variable. Zeile 40 muss also lauten: $_SESSION['userid'] = $user['id'];
- Ich würde entweder Sessions oder Cookies benutzen, nicht beides gemischt. Ansonsten gilt für setcookie() das gleiche wie für session_start(): Davor darf nichts an den Browser ausgegeben werden.
- Der Meta-Tag in Zeile 46 enthält einen Tippfehler: Das erste Attribut muss http-equiv heißen.
- Gemäß HTML-Standard muss ein <meta http-equiv=...>-Element in einem <head>-Element stehen. Kann gut sein, dass die gängigen Browser es auch ohne verstehen, ist aber nicht original.
 
Sicher, daß der Hash so gültig ist? Ich bekomme hier 61 Zeichen als Länge raus, das ist eins zuviel für CRYPT_BLOWFISH. Kann mich natürlich auch irren... aber, womöglich hat sich irgendwo aus Versehen was eingeschlichen?
 
Zurück
Oben