2016-03-20 2 views
1

Je ne sais pas pourquoi cela ne fonctionnera pas.La connexion PHP ne fonctionne pas. Utiliser password_verify et il semble causer quelques problèmes

login.php

$email = $_POST['email]; 
$password = $_POST['password]; 

$validEmail = filter_var($email, FILTER_VALIDATE_EMAIL); 

$getpassword = $connect->query("SELECT password FROM users WHERE email = '$validEmail'"); 
$row = $getpassword->fetch_assoc(); 

Tous les travaux ci-dessus bien. Je reçois le mot de passe auquel l'email est connecté, afin que je puisse "vérifier" le mot de passe.

$passVarify = password_varify($password, $row['password']); 

Lorsque je tente de "echo" out ou utiliser "var_dump"/"print_r" sur "$ passVerify", il montre que le chiffre "1"? Après avoir vérifié le mot de passe, j'exécute une autre requête, de sorte que je puisse obtenir le "userid" et les "privilèges". J'avais besoin de "déchaîner" ou de rendre le mot de passe "normal" à nouveau, afin que je puisse faire la requête ci-dessous.

$result = $objConnection->query("SELECT userid, privileges FROM users WHERE email = '$validEmail' && password = '$passVarify'"); 

Le code ci-dessous ne semble pas répondre à la requête? Cela ne fonctionne tout simplement pas pour une raison quelconque.

if($result->num_rows > 0) { 

    $row = $result->fetch_assoc(); 

    $userid = $_SESSION['userid'] = $row['userid']; 
    $privileges = $_SESSION['privileges'] = $row['privileges']; 

} 

Des bonnes idées? Parce que je me suis gratté l'arrière de la tête en essayant de comprendre pourquoi la première "requête" fonctionne et la seconde ne fonctionne pas ?!

+1

'password_verify' retourne vrai ou faux, rien d'autre. Vous ne devriez pas avoir besoin d'utiliser le mot de passe pour un clausel WHERE si vous avez déjà confirmé que tout va bien. Vous pouvez au lieu de simplement récupérer une colonne toutes les colonnes dont vous avez besoin et définir ce dont vous avez besoin si les informations d'identification sont correctes et sinon imprimer une erreur et/ou rediriger. –

+1

Vous utilisez 'password_hash/verify': bien. Vous injectez des valeurs fournies par l'utilisateur dans vos requêtes SQL: ... –

Répondre

1

Vous rendez la vie difficile pour vous-même.

D'abord le résultat d'un password_verify() est VRAI ou FAUX, c'est-à-dire vérifié ou non vérifié. Il ne pas UNHASH le mot de passe. Rien ne devrait pouvoir déchaîner un hachage.

De même, vous n'avez pas besoin de faire 2 appels séparés pour obtenir des données de votre base de données.

Vous n'avez pas non plus besoin de copier l'adresse électronique du tableau POST dans une variable scalaire.

Ce serait donc un flux plus simple pour votre code

Aussi, vous n'avez pas vraiment besoin de filtrer vos utilisateurs sont entrés mot de passe. Si ce n'est pas le cas, le verify_password() échouera et c'est tout ce que vous devez savoir.

$result = $connect->query("SELECT userid, privilages, password 
          FROM users 
          WHERE email = '{$_POST['email']}'"); 

$user = $result->fetch_assoc(); 

if (! password_verify($_POST['password'], $user['password'])) { 
    // show the password error screen 
    exit; 
} else { 
    // save all the SELECTED user info into a sub array of SESSION 
    // to be used later 
    $_SESSION['user'] = $user; 
} 

Vous devriez vraiment utiliser des requêtes paramétrées au lieu d'injecter des variables POST dans une requête.

$stmt= $connect->query("SELECT userid, privilages, password 
          FROM users 
          WHERE email = ?"); 

$stmt->bind_param("s", $_POST['email']); 
$stmt->execute(); 

$result = $stmt->get_result(); 
$user = $result->fetch_array(MYSQLI_ASSOC); 
+0

Merci :) Je sais qu'il y a beaucoup de choses que je devrais/pourrais faire mieux, mais je n'ai pas été programmeur depuis très longtemps . Donc maintenant, je fais ce que j'ai fait il y a des années. Je voudrais apprendre AOP et OOP, puisque ce que j'ai entendu et lu, il devrait être une approche "plus facile" et meilleure? Corrigez-moi si j'ai tort, s'il-vous plait. Merci encore. – Simon

+0

Vous n'avez pas tort. Mais il semble que votre code actuel utilise MYSQLI et non PDO – RiggsFolly