密码验证查询无效

时间:2017-04-22 20:53:15

标签: php passwords password-protection

我是php的初学者,也许问题很简单,但是当我尝试从我的数据库中获取哈希值,并让密码验证完成所有工作时,它总是给我假,即使是正确的密码。我试图从db中复制粘贴哈希并将其放入密码验证中,并且它有效。

$sql="SELECT * FROM users WHERE username='$myusername'";
$result=mysqli_query($connection,$sql);

// Mysql_num_row is counting table row
$count=mysqli_num_rows($result);
// If result matched $myusername, table row must be 1 row
if($count==1){
//This must be the problematic place
    $hash = mysqli_query($connection,"SELECT jelszo FROM users WHERE username =='$myusername'");
    if(password_verify($myjelszo,$hash))
    {
// Register $myusername, $myjelszo and redirect to file "login_success.php"
$_SESSION['username']= "myusername";
$_SESSION['jelszo']= "myjelszo";
header("location:login_success.php");
    }
else {
echo "Wrong Username or Password";
}

2 个答案:

答案 0 :(得分:0)

首先,你不应该直接将变量传递给你的查询,而应该使用预备语句(在这个特殊情况下):

$sql="SELECT * FROM users WHERE username='$myusername'";
$result=mysqli_query($connection,$sql);

应该是这样的:

$stmt= $connection->prepare("SELECT * FROM users WHERE username=?");
$stmt->bind_param("s", $myusername);
$stmt->execute();

<小时/> 我在另一个问题中看到的问题:

$hash = mysqli_query($connection,"SELECT jelszo FROM users WHERE username =='$myusername'");

double ==应该是单个的,因为这是一个SQL查询:

$hash = mysqli_query($connection,"SELECT jelszo FROM users WHERE username ='$myusername'");

但同样,它应该通过将其转换为准备好的声明来防止注入(参见前面的示例)

接下来,我假设'$ myjel​​szo'是您存储在变量中的密码,无论如何都不要清理输入。我们对它进行了讨论并进行了测试,请仔细阅读此主题关于密码安全性=&gt; https://stackoverflow.com/a/36628423/4950530

答案 1 :(得分:0)

有时,密码验证不适用于php大多数版本。我认为最合适的一个不需要使用任何PHP方法。

if($myjelszo != $hash))
    {
       $_SESSION['username']= "myusername";
       $_SESSION['jelszo']= "myjelszo";
       header("location:login_success.php");
    }
else
    {
       echo "Wrong Username or Password";
    }