Fehler bei password verify php?

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

Woher ich das weiß:Berufserfahrung – Ich bin gelernter Mediengestalter Digital und Print(IHK)
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 :)

Woher ich das weiß:Berufserfahrung – > 20 Jahre in der Softwareentwicklung

r0informatik 
Fragesteller
 21.05.2024, 06:55

Und wie löse ich das Problem damit?

Irgendwie muss ich ja die Variable trotzdem definieren

0
regex9  24.05.2024, 01:29
  1. Das $-Zeichen kennzeichnet Variablen. Sowohl bei einer Deklaration, als auch wenn man eine Variable für eine Operation anwenden möchte.
  2. 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.

0