2017-07-25 4 views
0

Passwort beantworten überprüfen immer false zurück nicht finden. Ich habe jede Antwort hier gesehen, aber nichts davon hat geholfen. Das Passwortfeld ist varchar (255). Wenn ich das Passwort aus einer Datenbank var_dump, zeigt es String (60) und das Passwort ist korrekt, aber die Funktion gibt immer noch falsch zurück. Hier ist der Code, der in der Datenbank gespeichert ist:password_verify hält falsche Rückkehr und ich kann überall

if(empty($_POST['pass'])) { 
    $passErr = "Password required!"; 
    $errors[] = "Pass error"; 
} else { 
    $pass = test_input($_POST["pass"]); 

    if(!preg_match("/^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,}$/", $pass)) { 
     $passErr = "Password not well formed"; 
     $errors[] = "Pass error"; 
    } else { 
     $pass_hashed = password_hash($pass, PASSWORD_DEFAULT); 

    } 
} 
$hash_ver = md5(rand(0, 1000)); 
$status = ""; 
$stm = $conn->prepare("INSERT INTO user VALUES(?, ?, ?, ?, ?, ?, ?, ?)"); 

$stm->bind_param("sssssssi", $id, $pass_hashed, $email, $fName, $lName, $hash_ver, $status, $id_role); 

$stm->execute(); 
echo strlen($pass_hashed); 

Und das ist Teil des Login-Skript

if(count($array) != 0) { 
    echo "<script>alert('Ima gresaka')</script>"; 
} else { 

    include('connectionFile/connection.php'); 


    $stmt = $conn->prepare("SELECT `name`,`last_name`,`status_verif`,`email`,`password` FROM user WHERE `email`=?"); 
    $stmt->bind_param("s", $email); 
    $stmt->execute(); 

    if($res = $stmt->get_result()) { 
     $count = $res->num_rows; 

     if($count == 1) { 

      $row = $res->fetch_assoc(); 
      $passwordb = $row['password']; 

      //echo "<p>".$passwordb."</p>"; 

      $verify = password_verify($pass, $passwordb); 

      if($verify) { 
       echo "<script>alert('Password match')</script>"; 
      } else { 
       var_dump($verify); 
       var_dump($passwordb); 
       echo "<script>alert('Password doesnt match')</script>"; 
      } 

     } else { 
      echo "<script>alert('0 rows')</script>"; 
     } 

    } else { 
     echo "<script>alert('No rows at all')</script>"; 
    } 

} 
+0

Haben Sie Echo Ihre '$ pass' versucht? Wird es gedruckt, wie Sie es erwarten? –

+1

Was macht diese Methode 'test_input()'? Vielleicht fügt/fügt man etwas hinzu, von dem man nichts weiß. –

+0

sollten Sie auch Passwörter in irgendeiner Art und Weise werden die Manipulation nicht und kann die Ursache für all dies sein. –

Antwort

0

Es gibt Zweimöglich Gründe. :

  • 1) $pass = test_input($_POST["pass"]);

    Die Funktion test_input() macht etwas mit der $_POST['pass'] Zeichenfolge, ohne dass der Anwender. Außerdem wird der Wert $pass im zweiten Codeblock nicht deklariert.

  • 2)

     $stm = $conn->prepare("INSERT INTO user VALUES(?, ?, ?, ?, ?, 
              ?, ?, ?)"); 
         $stm->bind_param("sssssssi", $id,$pass_hashed, 
         $email,$fName,$lName, $hash_ver,$status, $id_role); 
    

    Der Wert, den Sie eingefügt werden, wird nicht in die richtige SQL-Spalte eingefügt oder dem Wert, den Sie aus der SQL extrahieren ist nicht die richtige Spalte, vielleicht sind Extrahieren Sie und den Vergleich der md5 Hash Sie eingefügt?

Es wäre hilfreich, wenn Sie ein Beispiel Ausgabe zeigen können, wie zum Beispiel, was Sie var_dump Werte Zustand.

Es wäre auch sehr hilfreich zu zeigen, wie $pass im zweiten Codeblock gesetzt ist und was test_input tatsächlich im ersten Codeblock tut.

Verschiedene Teile des Codes könnte mit einer Verbesserung zu tun.

Denken Sie außerdem sorgfältig über Ihre logische Struktur nach - was ist, wenn $pass nicht zu Ihrer preg_match passt? Es wird weiterhin in Ihre Datenbank eingefügt. Sie müssen diese Art von Flow-Problemen richtig abfangen.

Read about how to display PHP error logs, oder besser noch, dump them to a file to read in your IDE.

+0

* "Vielleicht extrahierst und vergleichst du den MD5-Hash, den du eingefügt hast?" * - Das wird nicht eingefügt. Ich dachte es zuerst, aber sie fügen die richtige Variable in Ordnung ein. Diese MD5-Sache sieht nach etwas anderem aus. –

+0

@ Fred-ii-OP fügt beide Werte ein, aber da wir keine Ahnung haben, welche Spalten eingefügt werden und uns keine DB-Schemata gegeben haben, denke ich, dass dies eine Option ist, obwohl zugegebenermaßen unwahrscheinlich. – Martin

+0

Genau; völlig unbekannt und um so mehr Gründe, warum ich keine Antwort für dieses potentielle Kaninchenloch geschrieben habe. Ich wünsche dir hiermit alles Gute, lass es mich wissen, wenn du eine gute Taschenlampe brauchst ;-) Edit: Ich muss rennen. –

0

ich glaube, das Problem liegt nach der Variable $ row. Es erkennt $ passwordb = $ row ['password'] nicht in Ihrem Anmeldeskript. Versuchen Sie, wie dieser somerhing:

// $rows = $res->fetch_assoc(); 

while(($row = $res->fetch_assoc()) !== FALSE) { 
    $rows[] = $row; 
} 

function returnArray($rows, $string) 
{ 
    foreach($rows as $row) 
    { 
    return $row[ $string ]; 
    } 
} 

$passwordb = returnArray($rows, 'password'); 

//etc......... 
0

Thank you Zeit nehmen, um mein Problem zu lösen, gelang es mir, den Fehler zu finden. Das Problem war mit der Variablen $ pass. Nach dem Einschließen der Verbindungsdatei gab die $ pass-Variable nicht das zurück, was ich erwartet hatte, da in der Verbindungsdatei eine weitere $ pass-Variable vorhanden war. Nochmals vielen Dank, und tut mir leid, ich lerne immer noch, wie man StackOverflow richtig einsetzt.