2017-01-24 60 views
0

我想验证我的数据库中使用password_verify()函数的哈希密码,但它似乎并没有工作。请任何帮助。password_verify()不验证

<?php 
include("config.php"); 
include("vendor/password.php"); 

session_start(); 

if ($_SERVER["REQUEST_METHOD"] == "POST") { 

    $username = mysqli_real_escape_string($db , $_POST['umail']); 
    $password = mysqli_real_escape_string($db , $_POST['upassword']); 

    $userQuery = "SELECT username, password FROM users WHERE username = '$username' AND password='$password'"; 
    $result = mysqli_query($db ,$userQuery); 
    $queryRow = mysqli_fetch_array($result , MYSQLI_ASSOC); 
    $queryCount = mysqli_num_rows($result); 


    $verifyPassowrd = password_verify($_POST['upassword'] , $queryRow[2]); 

    if ($verifyPassowrd){ 
    header("Location:home.php"); 
    }else{ 
    echo "Username Or Password is invalid"; 
    } 
    mysqli_close($db); 
} 
?> 
+2

确保你***不要逃避密码](http://stackoverflow.com/q/36628418/1011527)** *或在哈希之前使用其他任何清理机制。这样做*更改密码并导致不必要的附加编码。 –

+0

[Little Bobby](http://bobby-tables.com/)说*** [你的脚本存在SQL注入攻击风险。](http://stackoverflow.com/questions/60174/how-can- ***)了解[MySQLi](http://php.net/manual)[准备](http://en.wikipedia.org/wiki/Prepared_statement)声明/en/mysqli.quickstart.prepared-statements.php)。即使[转义字符串](http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string)是不安全的! [不信?](http://stackoverflow.com/q/38297105/1011527) –

+1

'password_hash()'函数可以生成一些非常冗长的文本(当前的默认值是60个字符),因此使数据库现在尽可能大的场地将允许所需的长度。其次,PHP团队正在向该方法添加更多算法,这意味着哈希可以并将会增长。我们也不想限制用户使用他们选择的密码或密码的能力。最好为变化留出空间。 –

回答

1

您的密码在您的数据库中被哈希。
在您的查询中包含非哈希密码,因此查询结果将为空集。

因为您想检查password_verify函数中的返回哈希,所以不需要在查询的WHERE子句中输入密码。

更新摘要(我也是固定错字的):

<?php 
include("config.php"); 
include("vendor/password.php"); 

session_start(); 

if ($_SERVER["REQUEST_METHOD"] == "POST") { 

    $username = mysqli_real_escape_string($db , $_POST['umail']); 

    $userQuery = "SELECT username, password FROM users WHERE username = '$username'"; 
    $result = mysqli_query($db, $userQuery); 
    $queryRow = mysqli_fetch_array($result, MYSQLI_ASSOC); 
    $queryCount = mysqli_num_rows($result); 


    $verifyPassword = password_verify($_POST['upassword'], $queryRow['password']); 

    if ($verifyPassword){ 
    header("Location:home.php"); 
    }else{ 
    echo "Username Or Password is invalid"; 
    } 
    mysqli_close($db); 
} 
?> 
+0

非常感谢@Blaatpraat它完美的工作。感谢您的额外建议。我刚开始学习php。 – dela

+0

@dela没问题,这就是为什么。我也建议你认真听取给定意见的建议。尤其是对SQL注入的评论。 :) – Blaatpraat