2017-08-25 1 views
1

Arrière-plan - J'ai passé la dernière heure à regarder les différents sites de posts et ainsi de suite pour voir pourquoi ma fonction de vérification de mot de passe a soudainement cessé de fonctionner.PHP password_verify faux négatif

Chaque fois que j'essaie de l'utiliser, il renvoie false, y compris lorsque le mot de passe entré est correct.

J'ai renvoyé mon entrée et mon hachage, qui correspondent tous les deux (en comparant le hachage de la table à celui qui est en écho). Cependant, lorsque ces variables sont passées à password_verify, elles retournent false à 100% du temps.

À mon avis, qu'est-ce qui ne va pas? - Basé sur a post from an external site, je pense que cela est dû à la façon dont ma variable hashedPassword est en cours d'analyse. Quand est compare les deux, quelque chose ne va pas dans le type de variable et retourne false.

À quoi ressemble mon code et ma base de données? -

users tableau. Contient d'autres colonnes.

userId | username | password 
---------------------------- 
    1 | example | temp1 

Classe contenant la fonction de vérification du mot de passe. (Ont parés essayer de suite/catch)

public function checkPasswordCorrect($username, $password) { // Returns true is the entered password is correct and false if it isn't. 

    // This creates a mysqli context to run the connection through. 
    $mysqli = new mysqli($this->dbHost, $this->dbUsername, $this->dbPassword, $this->dbPlusPlus); 

    // If there is an error connecting to the database, it will be printed and the process will close. 
    if (mysqli_connect_errno()) { 
     printf("Connect failed: %s\n", mysqli_connect_error()); 
     exit(); 
    } 

    $sql = "SELECT password FROM users WHERE username='$username'"; 
    $result = $mysqli->query($sql); 
    $row = $result->fetch_array(MYSQLI_ASSOC); 

    $hashedPassword = $row["password"]; 

    $mysqli->close(); 

    echo $password."<br>".$hashedPassword."<br>"; // The input is correct and the hash matches that in the table. 

    // We return a value of true or false, depending on the outcome of the verification. 
    if(password_verify($password, $hashedPassword)) { 
     echo "return true"; 
     return true; 
    }   
    else { 
     echo "return false"; 
     return false; 
    } 
} 

En écho $hashedPassword juste avant d'utiliser password_verify, les matches de hachage en vérifiant manuellement, comme vous pouvez le voir ci-dessous la sortie.

temp0022 
$2y$10$9TgjJzSaqOB 
return false 

Qu'est-ce que je demande? -

  1. Y at-il une meilleure façon de vérifier les entrées de mot de passe, plus précisément, la façon dont je tire les informations de la table (il doit y avoir un moyen plus simple de le faire).

  2. La variable analyse-t-elle à blâmer? Y a-t-il de la documentation ou des articles disponibles pour ce sujet que je n'ai pas vus?

Que sais-je? - Mon utilisation de mysqli est choquante, je suis nouveau pour elle. Je suis également conscient qu'il existe des réponses similaires, mais il semble que ce soit une erreur de syntaxe plus que toute autre chose.

Merci d'avoir pris le temps de nous aider! : D

Pour tous ceux d'entre vous qui sont inquiets que je vais être frappé par des attaques par injection SQL: J'ai depuis modifié ce code exemple massivement et je l'aide, préparés déclarations. Merci pour votre préoccupation :)

+0

Combien de caractères autorisez-vous pour le champ 'password' dans la base de données? Le mot de passe qu'il imprime est trop court et a été tronqué. Les hash de mot de passe générés (en utilisant password_verity()) ont environ 60 caractères. Si vous avez un champ varchar plus court, le hash complet ne sera pas sauvegardé. –

+0

Je trouve ça ironique que vous ayez tapé vos mots de passe mais n'essayez pas d'empêcher [Injection SQL] (http://bobby-tables.com/), presque comme si vous vouliez seulement que la moitié de votre système soit sécurisé – GrumpyCrouton

+0

[Little Bobby] (http://bobby-tables.com/) dit ** [vous êtes à risque d'attaques par injection SQL] (https://stackoverflow.com/q/60174/) **. En savoir plus sur [Prepared Statements] (https://en.wikipedia.org/wiki/Prepared_statement) pour [MySQLi] (http://php.net/manual/en/mysqli.quickstart.prepared-statements.php). Même ** [échapper à la chaîne] (https://stackoverflow.com/q/5741187) ** n'est pas sûr! Je recommande "PDO", dont j'ai [a écrit une fonction pour] (http://paragoncds.com/grumpy/pdoquery/#function) pour le rendre extrêmement ** facile **, très ** propre **, et bien plus ** secure ** que d'utiliser des requêtes non paramétrées. – GrumpyCrouton

Répondre

3

Vérifiez votre structure de table.Votre champ de hachage doit être de longueur 60 (pour PASSWORD_BCRYPT) ou 255 (pour PASSWORD_DEFAULT) (ref) pour enregistrer l'ensemble du hachage. Ce que vous avez obtenu de la base de données est de 18 caractères. Vous l'avez probablement comme VARCHAR(18), donc il est tronqué lors de la sauvegarde, ce qui explique pourquoi vous ne recevez pas de correspondance.

Editer: Longueur ajoutée pour l'algorithme PASSWORD_DEFAULT. Merci @ Don'tPanic.

+0

Merci beaucoup! <3 – Will

+1

[La documentation PHP] (http://php.net/manual/fr/function.password-hash.php) recommande une longueur de 255. –

+0

@ Don'tPanic Je vais l'éditer dedans, pour le noter le long de la longueur BCRYPT. Merci! – ishegg