password_verify返回错误的帐户详细信息

时间:2014-08-02 17:04:39

标签: php sql security passwords

我的password_verify()总是提供错误的帐户详细信息,但详细信息是正确的。 我的片段:

    include('Application/Bootstrap.php'); 
    if(isset($_SESSION['username'])) {
    header('location: '.$config['website']['url'].'/me'); // Use this if the user HAS to login.
    }
if (isset($_POST['submit'])) {
       $username = $db->real_escape_string($_POST['username']);
        $password = $db->real_escape_string($_POST['password']);

    if (!$_POST['username'] || !$_POST['password']) {
        echo 'Je moet een gebruikersnaam en wachtwoord invullen om in te loggen.';
    }
    else {

        $check = $db->query("SELECT * FROM users WHERE username = '".$username."' and password = '".$password."'");
        $row=mysqli_fetch_assoc($check);

                 if (password_verify($password, $row['password'])) { //I try $password AND $_POST['password']
                 $_SESSION['username'] = $_POST['username'];
                header("Location: /me");
                exit;                   
            } 
            else {
                // ALS HET NIET KLOPT!!!!
                echo 'Je gegevens kloppen niet.';               }
        }
    }

有人能帮助我吗?我已经搜索了整个互联网。但我无法找到它。我的数据库列varcher增加到255.如果你问我的注册表是错误的,那不是这样。片段:

$db->query("INSERT INTO users
            (username,password,mail,auth_ticket,motto,ip_reg)
            VALUES ('$username', '".password_hash($pw, PASSWORD_BCRYPT, $options)."', '$mail', '$ticket', '$motto', '$ip')") or die($db->error);

费用为' 10'

我希望有人可以帮助我。

1 个答案:

答案 0 :(得分:0)

您正在检查密码两次,第一次在SQL查询中检查密码:

$check = $db->query("SELECT * FROM users WHERE username = '".$username."' and password = '".$password."'");
                                                                         |< remove this part          >|

此查询只会找到具有给定用户名且具有给定密码的用户。但由于只存储了密码的哈希值,因此该查询永远不会找到一行。您应该使用密码删除支票,并仅按用户名搜索用户。

为了避免SQL注入,您还应该使用parametrized queries

$stmt = $db->prepare('SELECT * FROM users WHERE username = ?');
$stmt->bind_param('s', $_POST['username']);

$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();
...
if (password_verify($_POST['password'], $row['password']))
{
  ...
}
$result->close();