2017-08-11 1 views
-6

Leider habe ich die Lösung des Problems nicht gefunden, dass ich ein Anfänger bin, und ich weiß nicht, warum diese Funktion nicht funktioniert und wie ich es verwenden werde. Wenn mir jemand die Lösung geschrieben hat, um den Code und das Problem zu verstehen, bitte. (PS: dsl nur für Google-Übersetzung)password_verify() funktioniert nicht

(//Really 20 hours I try. No solution...(page login) 
    if (isset($_POST['connexion'])) 
{ $pseudoconnect=htmlspecialchars($_POST['pseudoconnect']); 
$passwordconnect=htmlspecialchars($_POST['passwordconnect']); 
if (!empty('$pseudoconnect') AND !empty('$passwordconnect')) 
{ 
$pseudoconnectlenght=strlen($pseudoconnect) ; 
$passwordconnectlenght=strlen($passwordconnect) ; 
if ($pseudoconnectlenght<3 || $pseudoconnectlenght>10 || $passwordconnectlenght<3 || $passwordconnectlenght >10) 
{    
echo "remplis tous les infos exacte"; 
} 
else 
{      
$repnom = $connect->prepare("SELECT password FROM membres WHERE pseudo=? "); 
$repnom->execute(array($passwordconnect)); 
$userinfo= $repnom->fetch(); 
$_SESSION['password']= $userinfo['password']; 
if (password_verify($_POST['passwordconnect'], $userinfo['password'])) 
{ 
echo "valid"; 
} else { 
echo "pas valid";}}} 

(Seite Registrierung richtig funktioniert) Ich verwende password_hash und seine Funktion gut .. PS: dsl nur für Google-Übersetzung)

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


      if (!empty($_POST['pseudo']) AND !empty($_POST['password'])) 
      { 
        $pseudo=htmlspecialchars($_POST['pseudo']); 
        $password=htmlspecialchars($_POST['password']); 
        //$password=password_hash('password',PASSWORD_DEFAULT,['cost'=>12]); 

         $pseudolenght=strlen($pseudo); 
         $passwordlenght=strlen($password); 
         /*verifier les champs */ 
         if ($pseudolenght<4 ||$pseudolenght>10 || $passwordlenght<4 || $passwordlenght> 10) 
          { 

              echo "pass ou pseudo pas correct"; 
          }  
           else //enregistrement et verifier pseudo 
            { 

             $repetepseudo = $connect->prepare("SELECT * FROM membres WHERE pseudo=?"); 
             $repetepseudo->execute(array($pseudo)); 
             $existpseudo = $repetepseudo->rowCount(); 
             //verifier pseudo si déja existe 
               if ($existpseudo == 0) 
                { 
                 //hasher password 

                 $hash=password_hash($password,PASSWORD_DEFAULT,['cost'=>12]); 

                 $sql = "INSERT INTO membres (pseudo,password) VALUES (?,?)"; 
                 $query = $connect->prepare($sql); 
                 $query->execute(array($pseudo,$hash)); 





                  echo "enregistrement valide"; 
                  //header('location: html.php'); 

                } 

                 else 
                  { 
                   echo "déja utiliser"; 
                } 
                } 


                  } //if empty 
                    else { 

                       echo "remplir tous les champs "; 
                      } 





                           }//if isset eenvoyer 
+0

Entschuldigung create code funktioniert nicht für mich –

+2

Hinter Ihrem Code hier, nicht Bilder ... – Rasclatt

+0

Auch was funktioniert nicht, das ist eine breite Aussage – Rasclatt

Antwort

1

Sie müssen das Passwort aus der Datenbank abrufen, die auf den Benutzernamen übereinstimmt.

SELECT password FROM members WHERE psuedo = ? 

Überprüfen Sie anschließend das angegebene Passwort, das dem Benutzernamen entspricht.

if (password_verify($_POST['password'], $userInfo['password'])) { 
    //... valid user 
} else { 
    //... invalid user 
} 

Wenn es true zurückgibt, bedeutet dies, den Benutzernamen und das Passwort eingegeben stimmt mit dem Benutzer in der Datenbank.

Wenn Ihre Spalte pseudo nicht eindeutig ist (nach der Sie sehen, nach der Sie suchen), müssen Sie alle Benutzer durchlaufen, um das Kennwort zu finden, das password_verify übergibt.

Der Grund ist password_hash generiert ein eindeutiges Salz jedes Mal, wenn es aufgerufen wird, wodurch das generierte Hash-Passwort unterschiedlich sein. Es ist unmöglich, das in der Datenbank gespeicherte Passwort abzufragen.

So wird das nicht funktionieren

var_dump(password_hash('test', \PASSWORD_DEFAULT) === password_hash('test', \PASSWORD_DEFAULT)); //false 

Ergebnis: https://3v4l.org/jM4YH

Darüber hinaus müssen Sie Ihre password_hash Nutzung ändern:

$hash = password_hash($password, \PASSWORD_DEFAULT, ['cost' => 12]); 

Wie es derzeit ist, das Kennwort jedes Benutzers würde sei das Wort password und nicht das Passwort, das sie geliefert haben.


Als Hinweis, sollten Sie auch password_needs_rehash nach Überprüfung verwenden, von denen ein Beispiel einer erfolgreichen Anmeldung auf der Seite ist. Dies stellt sicher, dass Passwörter für Sicherheitsupdates von PHP beibehalten werden.


Aktualisiert

Mit der Frage geändert meine Vorschläge entsprechen.

Sie müssen das Kennwort aus der Datenbank abrufen, indem Sie den Benutzer mit dem angegebenen vergleichen.

$repnom = $connect->prepare("SELECT password FROM membres WHERE pseudo = ?"); 
$repnom->execute(array($passwordconnect)); 

Sollten die pseudo param entsenden, nicht die password param

$repnom->execute(array($pseudoconnect)); 

Auch da Sie htmlspecialchars auf dem Passwort in der Datenbank gespeichert ausführen, sollten Sie das gleiche verwenden auf password_verify

$passwordconnect = htmlspecialchars($_POST['passwordconnect']); 

//... 

password_verify($passwordconnect, $userinfo['password']); 
-1

Sie müssen überprüfen das Passwort gegen den Hash von password_hash

Verwandte Themen