2017-04-22 93 views
-1

我正在为我的博客制作一个登录屏幕,但是当它检查您在输入字段中设置的密码是否与数据库中的散列密码相同时,他说我的当它不是时,密码是错误的。我的登录脚本在验证散列密码时失败

我已经搜索了很长时间,并问了几个班的同学,但它仍然无法正常工作。

<form id="loginForm" method="post" action="?page=blogInput"> 
      <br><h1>LOGIN</h1> 

      <input type="text" placeholder="username" name="username" id="username" maxlength="24"><br> 
      <input type="password" placeholder="password" name="password" id="password" minlength="8" 
        maxlength="16"><br> 
      <input type="submit" value="login" id="submit"> 
     </form> 
    <?php 
include_once('resources/db.php'); 

$username = $_POST['username']; 
$password = $_POST['password']; 

$query = $dbh->prepare("SELECT username FROM users WHERE username=:username"); 
$query->execute(array(':username' => $username,)); 
$saved_password = $query->fetch(PDO::FETCH_ASSOC)['password']; 

if (isset($username, $password)){ 
    if (password_verify($password, $saved_password)){ 
     if ($query->rowCount() == 1){ 
      echo "<script language='javascript' type='text/javascript'> location.href='register.php' </script>"; 
     } 
     else{ 
      echo "<script type=\"text/javascript\">alert('Wrong username!')</script>"; 
     } 
    }else{ 
     echo "<script type=\"text/javascript\">alert('Wrong password or username!')</script>"; 
    } 

}else{ 
    echo "<script type=\"text/javascript\">alert('You need to fill in all fields')</script>"; 
} 

?> 

它被编辑为最后的评论建议。

+1

您正在做PDO查询的方式容易受到SQL注入的影响,请改用占位符。 – Akar

+0

我看到一个'prepare()'调用,但是你从不'执行'()'语句。你应该在SQL中用参数':username'替换''用户名'',并在尝试获取之前调用'$ query-> execute(array(':username'=> $ username))''。 –

+0

当你'echo $ saved_pa​​ssword'时,你会得到你期望的散列吗? – Thakkie

回答

1

您的代码会检查$password两次。首先在查询中检查密码是否匹配。然后,它检查密码的散列是否匹配相同的值

只要从数据库查询中删除and password=废话,然后按照注释中所述完成参数输入更正。你应该没问题。


...我只注意到...

SELECT username FROM ... 

您没有选择从数据库的密码(哈希)!

SELECT `password` FROM ... 
+0

这是你修补的东西吗?我现在已收到警报,但仍未登录 –

+0

OP正在进行编辑,现在他们的查询根本没有任何意义。编辑:它经历了不少修订http://stackoverflow.com/posts/43559298/revisions - 编辑#2:它现在已经经历了又一次编辑。 –

+0

多数民众赞成在很好的可能,但我不知道我必须这样做,所以我做我理解你们都说我必须做的。 –