2014-04-16 148 views
-2

我已经经历在PHP中password_hash()password_verify()方法和我一直在努力,包括在我的代码。我似乎无法完成它的工作,我已经通过一系列的Google搜索甚至是一些关于SO的问题,但他们似乎没有解决这个问题。在数据库PHP password_verify()似乎不工作

我列的长度为255当我尝试运行代码,我得到的消息$loginerror。这是我的代码块。请问我做错了什么。

$signin_email=$_POST['signin_email']; 
$signin_password=$_POST['signin_password']; 

if($valid){ 
    require_once 'scripts/connect_to_mysql.php'; 
    $sql = "SELECT First_name, Last_name,Password FROM customer WHERE Email=? AND Password=? LIMIT 1"; 
    $stmt=$conn->prepare($sql);//preparing the statement 
    if(!$stmt){ 
     echo "Unable to prepare: ".$conn->errno. " " .$conn->error; 
    } 
    //executing the statement 
    //$date=date('d m Y h:i:s'); 
    if(!$stmt->bind_param('ss', $signin_email, $signin_password)){//bind parameters to sql statement. i=integer, s=string, b=blob, d=double 
     echo "Binding parameters failed: ".$stmt->errno. " " . $stmt->error; 
    } 
    if(!$stmt->execute()){//executing the statement 
     echo "Statement Execution failed: ". $stmt->error; 
    } 
    if(!$stmt->bind_result($dbfirstname,$dblastname,$dbpassword)){// used to bind variables to a prepared statement for result storage 
     echo "Unable to bind results to variables: ".$stmt->error; 
    } 
    $stmt->store_result(); 
    //echo $stmt->num_rows; 
    echo $dbpassword; 
    if(password_verify($signin_password, $dbpassword)){ 
     if($stmt->num_rows===1){//to check if username and password actually exists 
      while($row=$stmt->fetch()){ 
       $user=$dbfirstname. " ". $dblastname; 
       echo $user; 
      } 

      /*$_SESSION['user']=$user; 
      header('location:logintest.php'); 
      exit();*/ 
     } 
    } 
    else{ 
     //$error="Invalid Email address/Password. Please try again"; 
     $loginerror= "Invalid Email address/Password. Please try again"; 
    } 

    $stmt->close();//closing the prepared statement 
    $conn->close();//closing the connection 
} 

回答

1

问题不在于password_verify但在你建立你的查询方式:

`$sql ="SELECT First_name, Last_name,Password FROM customer WHERE Email=? AND Password=? LIMIT 1"; 

您绑定$signin_password到该查询,它包含不$_POST哈希值。

有2个解决方案:

1)从查询中删除AND Password=? - 你会password_verify

2检查您的密码)的变化$signin_password到:

$signin_password=password_hash($_POST['signin_password']); 

(但使用这种方式password_verify是一种无关紧要的。

+1

注意,第二个选项应该强烈反对,因为'password_hash'被设计成透明的升级到未来更强的哈希算法。 'password_verify'查看创建记录时使用的散列值,可能不是当前的默认值。 – IMSoP

+0

@IMSoP这是很重要的评论,谢谢。 – MSadura

+0

感谢您的回复@MarkS。散列'$ signin_password'将使它不等于数据库中的密码,因为它会创建一个与之前创建的散列不同的新散列。我从查询中删除了'AND Password =?',仍然得到了相同的结果。请帮忙。 – seun

-1
$signin_password=$_POST['signin_password']; 

$hash = password_hash($dbpassword, PASSWORD_DEFAULT); 

if (password_verify($signin_password, $hash)) 

{ 

    echo 'Password is valid!'; 

} 

else 

{ 

    echo 'Invalid password.'; 

} 

试一试:)更好的选择是建立你自己的查询。

+2

散列'$ dbpassword'将毫无意义:散列的重点是存储在数据库中的所有内容都是散列的*结果*。 – IMSoP