我是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";
}
答案 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'");
但同样,它应该通过将其转换为准备好的声明来防止注入(参见前面的示例)
接下来,我假设'$ myjelszo'是您存储在变量中的密码,无论如何都不要清理输入。我们对它进行了讨论并进行了测试,请仔细阅读此主题关于密码安全性=&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";
}