2015-03-13 87 views
3

我正在尝试使用bcrypt算法对密码进行哈希处理,但我遇到了一些问题。首先,我找不到合适的位置来检查password_verify()是否返回true。验证PDO准备语句中的password_hash()

$admin = $_POST['admin-user']; 
$pass = $_POST['admin-pass']; 

$password_hash = password_hash($pass, PASSWORD_BCRYPT); 

if (isset($admin)&&isset($pass)&&!empty($admin)&&!empty($pass)) { 

$admin_select = $link->prepare("SELECT `id` FROM `admins` WHERE `username` = :admin"); 

$admin_passwd = $link->prepare("SELECT `password` FROM `admins` WHERE `username` = :admin_pw"); 
$admin_passwd->execute(array(':admin_pw' => $admin)); 
$admin_pwd = $admin_passwd->fetch(PDO::FETCH_ASSOC); 

    if (password_verify($pass, $admin_pwd)){ 

      if ($admin_select->execute(array(':admin' => $admin))) { 
       $res = $link->query('SELECT COUNT(*) FROM requests'); 
       $query_num_rowz = $res->fetchColumn(); 
      if ($query_num_rowz == 0) { 
       echo 'No records found'; 
      } else if ($query_num_rowz > 0) { 
       $query = $link->prepare("SELECT id FROM admins WHERE username = :admin"); 
       $query->execute(array(':admin' => $admin)); 
       $admin_id = $query->fetch(PDO::FETCH_ASSOC); 
       $_SESSION['admin_id'] = $admin_id; 
       header('Location: index.php'); 
      } 
     } 
    } 
} 

其次,我不确定这是选择用户密码的正确方法。

$admin_passwd = $link->prepare("SELECT `password` FROM `admins` WHERE `username` = :admin_pw"); 
$admin_passwd->execute(array(':admin_pw' => $admin)); 
$admin_pwd = $admin_passwd->fetch(PDO::FETCH_ASSOC); 

回答

3

因为你没有把->fetch在一个循环中,单个调用将返回关联数组的单行。您必须首先访问正确的索引(本例中为password)。然后将password_verify内部的行值(至少如果已被散列)与用户输入进行比较。粗略示例:

if(!empty($_POST['admin-user'] && !empty($_POST['admin-pass']))) { 
    $admin = $_POST['admin-user']; 
    $pass = $_POST['admin-pass']; 

    $admin_info = $link->prepare("SELECT `password` FROM `admins` WHERE `username` = :admin_user"); 
    $admin_info->execute(array(':admin_user' => $admin)); 
    $row = $admin_info->fetch(PDO::FETCH_ASSOC); 

    if(!empty($row)) { 
     // check if the hashed row password 
     if(password_verify($pass, $row['password'])) { 
      // okay 
     } 
    } else { 
     // not found 
    } 
} 
+0

+1。如果我为这样的课程上课,这会是一个好主意吗?即具有两种方法的类别。其中一个用于用户信息,另一个用于管理员? – schmitsz 2015-03-13 14:44:13

+0

@schmitsz如果它会有利于你使用类然后这样做,你可能需要重用一些方法,那么我认为这将是很好的 – Ghost 2015-03-13 14:46:52