PHP password_hash(), password_verify()

Mon script d'inscription accepte un mot de passe utilisateur, puis utilise PHP password_hash fonction pour crypter le mot de passe, puis la place dans une base de données. Quand je aller à la connexion à l'aide de l'utilisateur vient de créer, j'obtiens le message d'erreur qui vérifie si les mots de passe sont les mêmes ou pas. Dans mon cas, ils ne sont pas. Ce que je fais mal quand je fais l'appel à la password_verify fonction dans le script de connexion?

REGISTRE

if($_SERVER["REQUEST_METHOD"] == "POST"){
    function secure($data){
        $data = trim($data);
        $data = stripslashes($data);
        $data = htmlspecialchars($data);
        return($data);
    }

    $p_num = secure($_POST["p_number"]);
    $first_name = secure($_POST["first_name"]);
    $last_name = secure($_POST["last_name"]);
    $email = secure($_POST["email"]);
    $password = secure($_POST["pw"]);
    $verify_password = secure($_POST["pw_verify"]);
    $program = secure($_POST["program"]);
    $role = secure($_POST["role"]);
    $logged_in = 0;
    $registered = 0;
    $image = "../images/profile_placeholder.png";

    if($password != $verify_password){
        echo "Nope.  Passwords";
    }
    else{
        $registered = 1;
        $password = password_hash($password, PASSWORD_DEFAULT);
        $insert = "INSERT INTO `$user_table`(`user_id`, `first_name`, `last_name`, `password`, `image`, `email`, `program`, `role`, `logged_in`, `registered`) VALUES('" .$p_num ."', '" .$first_name ."', '" .$last_name ."', '" .$password ."', '" .$image ."', '" .$email ."', '" .$program ."', '" .$role ."', '" .$logged_in ."', '" .$registered ."')";
        $query = mysqli_query($connect, $insert);
        echo "Success!";
    }
}

CONNEXION

if($_SERVER["REQUEST_METHOD"] == "POST"){
    $p_num = $_POST["username"];
    $pwd = $_POST["password"];

    $query = "SELECT * FROM `$user_table` WHERE `user_id` = '$p_num'";
    $result = mysqli_query($connect, $query);
    while($row = mysqli_fetch_assoc($result)){
        $user_id = "{$row['user_id']}";
        $first_name = "{$row['first_name']}";
        $last_name = "{$row['last_name']}";
        $user_name = $first_name ." " .$last_name;
        $password = "{$row['password']}";
        $image = "{$row['image']}";
        $email = "{$row['email']}";
        $program = "{$row['program']}";
        $role = "{$row['role']}";
        $status = "{$row['logged_in']}";
        $registered = "{$row['registered']}";
        if(($user_id == $p_num) && (password_verify($pwd, $password))){
            $_SESSION["id"] = $user_id;
            $_SESSION["user"] = $user_name;
            $_SESSION["program"] = $program;
            $_SESSION["pass"] = $password;
            $_SESSION["image"] = $image;
            $_SESSION["email"] = $email;
            $_SESSION["role"] = $role;
            $_SESSION["status"] = $status;
            $_SESSION["registered"] = $registered;
            $loggedin = "UPDATE `$user_table` SET `logged_in` = 1 WHERE `user_id` = '$user_id'";
        }
    var_dump($pwd);
    var_dump($password);
}

Voici ce que j'obtiens lorsque je fais un var_dump:

string(1) "1" string(16) "$2y$10$0aysCso3b"

Donc, clairement, les mots de passe ne sont pas appariés ensemble. Donc, sur le script d'inscription, le mot de passe est haché et envoyé à la base de données. Ensuite, lorsque l'utilisateur passe à la connexion, le login script regarde le mot de passe saisi par l'utilisateur à la connexion, puis il vérifie contre le hachage de mot de passe dans la base de données à l'aide de password_verify. Pourtant, le hachage de mot de passe n'est pas d'accepter l'onu-hachage de mot de passe comme un match. Ce que je ne comprends pas, pourquoi?

  • Où sont $pwd et $password à venir à partir de votre script de connexion?
  • Oups, je pense tout copié. Il a été ajouté à la question.
  • Note: Vous devez ajouter exit; après chacun de vos en-têtes. I. e.: header("Location: ../pages/denied_login.php"); exit;
  • Ajouter les rapports d'erreur en haut de votre fichier(s) à droite après l'ouverture <?php tag error_reporting(E_ALL); ini_set('display_errors', 1); voir s'il cède rien et or die(mysqli_error($connect)) à mysqli_query()
  • J'ai compris et c'est encore kickin retour rien.
  • Votre secure méthode ne fournit pas de la bonne manipulation pour empêcher les injections SQL.
  • Votre secure() fonction peut être modifier le hachage de mot de passe. Utiliser les requêtes préparées à la place.
  • Ma méthode n'est pas ce qui est remis en question ici. Je comprends les requêtes sont vulnérables à l'injection, à partir de ce moment, je ne suis pas concerné par cela.
  • Bien que le stockage/hachage votre mot de passe il le pouvait. Utilisation var_dump() pour voir ce qui est de passage.
  • Désolé, ce commentaire a été Gumbo, ne pas voir la vôtre jusqu'à maintenant
  • lol pas de soucis, je me suis dit autant 😉
  • Ok, donc les mots de passe ne sont pas réellement de correspondance.
  • Voici une méthode que j'utilise $sql = "SELECT * FROM table WHERE id = 1"; $result = $mysqli->query($sql); if ($result->num_rows === 1) { $row = $result->fetch_array(MYSQLI_ASSOC); if (password_verify($pwd, $row['password'])) { echo "Match"; } vous pouvez ajouter de la fantaisie après 😉
  • Pour une raison quelconque, les mots de passe sont encore de retour en tant que différentes chaînes
  • Vous n'êtes pas encore à l'aide que secure() fonction de stocker des mots de passe avec, êtes-vous? Je vous suggère de faire une copie de votre script, baisse de la fonction et l'utiliser normalement. Créer un nouvel utilisateur/mot de passe, I. e.: john avec 12345, puis vérifier à nouveau avec ma suggestion que je vous ai donné.
  • J'ai supprimé le fonctionnement entièrement sécurisée et supprimé tous les appels à elle. J'ai même créé un nouvel utilisateur avec un nouveau mot de passe. Mais pour une raison quelconque, le password_verify fonction ne correspond pas à la accepté de mot de passe et attend le mot de passe.
  • J'ai aussi ajouté le var_dump sorties à la question, ce qui montre qu'ils ne sont pas appariés, mais d'après la documentation, ils doivent correspondre.
  • Attendez une minute, je pense que votre colonne de longueur n'est pas assez long. Une table de hachage va produire un beaucoup plus longue que cela. Une table de hachage va produire quelque chose comme $2y$10$fXJEsC0zWAR2tDrmlJgSaecbKyiEOK9GDCRKDReYM8gH2bG2mbO4e et votre var_dump montre que $2y$10$0aysCso3b - augmenter votre colonne de longueur de 255 juste pour être sûr, et mis à VARCHAR si pas déjà fait.
  • Je sais que c'est mis en VARCHAR, et je suis sûr que la longueur est fixée à 255(il paraît bizarre à moi aussi qu'il semble être de coupe off). Je vais vérifier pour assurer demain quelle est la longueur. Je vais vous laisser savoir quand j'en trouverai.

InformationsquelleAutor | 2014-10-23