【问题标题】:Updating field validates password?更新字段验证密码?
【发布时间】:2014-10-29 12:25:53
【问题描述】:

好的,作为我的教育项目,我目前正在开发一个使用 PHP 和 mysqli 的安全登录系统。一直很顺利,但现在遇到了一个让我和同学、老师和我都感到困惑的问题。

我正在通过 password_hash 和 password_verify 散列和检查我的密码。

当我创建一个帐户时,所有内容都会正确存储在数据库中。然后,当我尝试使用正确的密码登录时,它会提示我密码不正确。

现在这是关键:当我进入 PHPMyAdmin 时,复制存储在数据库中的散列密码,并使用该精确复制的密码更新密码字段......它可以工作。我可以使用我使用的密码按预期登录,它不会给我任何错误。

有谁知道发生了什么,以及如何解决它?

用于注册的代码:

public function createAccount()
{
    global $con;

    $this->password = password_hash($this->password, PASSWORD_DEFAULT)."\n";
    $sql='INSERT into user (username, password, email, creation_date)
        VALUES (?,?,?,?)';

    // Prepare statement
    $stmt = $con->prepare($sql);
    if($stmt === false) {
      trigger_error('Wrong SQL: ' . $sql . ' Error: ' . $con->error, E_USER_ERROR);
    }

    // Bind parameters. Types: s = string, i = integer, d = double,  b = blob
    $stmt->bind_param('ssss',$this->username,$this->password,$this->email,$this->creationDate);

    // Execute statement
    $stmt->execute();

    echo $stmt->insert_id;
    echo $stmt->affected_rows;

    $stmt->close();

    $_SESSION['login'] = true;
    $_SESSION['username'] = $username;
    Header("Location: index.php");
}

用于验证凭据的代码:

public function fetchCredentials() {
    // Select a set of credentials from the username given in form and return as array
    global $con;
    $sql = 'SELECT id, password FROM user WHERE username = ?';

    // Prepare statement 
    $stmt = $con->prepare($sql);
    if($stmt === false) {
      trigger_error('Wrong SQL: ' . $sql . ' Error: ' . $con->error, E_USER_ERROR);
    }

    // Bind parameters. Types: s = string, i = integer, d = double,  b = blob
    $stmt->bind_param('s',$this->username);

    // Execute statement
    $stmt->execute();

    // Store all results in an array
    $rs=$stmt->get_result();
    $arr = $rs->fetch_all(MYSQLI_ASSOC);
    $stmt->close();

    return($arr);
}

public function validateCredentials() {
    // Get credentials
    $arr = $this->fetchCredentials();

    // Validate username
    if (count($arr) > 1) {
        $this->error = 'crit';
        $this->abort = true;
    } else if (count($arr) < 1) {
        $this->error = 'badLogin';
        $this->abort = true;
    } else {
        $arr = $arr[0];
    }

    echo $arr['password'].'<br>'.$this->password;
    // Validate password. NOTE: This is where the issue arises. Password_verify() will return false where it    should return true.
    if ($this->abort == false && !password_verify($this->password, $arr['password'])) {
        $this->error = 'badLogin';
        $this->abort = true;
    }

    // Return values if needed
    if ($this->abort == false) {
        $this->id = $arr['id'];
    }
    return $this->abort;
}

调用登录的部分:(是的,validatecredentials 函数被调用了两次。是的,那里还有一些其他的东西写得不是很好。这部分代码仍然需要一些工作,它是解决上述问题后我要做的第一件事)

function login()
{
    $newCred = new credentials(
    $_POST['username'],
    $_POST['password']);

    if ($newCred->checkForm() == false
    && $newCred->validateCredentials() == false) {
        $newLogin = new login(
        $newCred->validateCredentials()['id']);

        $newLogin->login();
        $newLogin->getUserDetails();
    } else {
        $newCred->fetchError();
    }
}

【问题讨论】:

  • 你认为没有一行代码的人如何帮助你?
  • 代码请。但是根据哈希不允许正确登录的经验,请确保您的数据库表列设置为文本或一些不会切断哈希的大数字
  • 您的帖子从一开始就很糟糕...您使用的是 mysqli 而不是 PDO...您使用的是什么类型的哈希?另外,请提供代码示例以了解您正在处理的内容!
  • @Typhomism 该列设置为 varchar(255),所以应该没问题。
  • @RikPronk 如果您在保存之前将哈希值打印到屏幕上,然后检查保存的内容是否相同?

标签: php mysqli password-hash


【解决方案1】:

好的,感谢所有提供帮助的人:谢谢。我刚刚得到我同学的帮助,他设法找到了问题。我现在正在打自己。

$this->password = password_hash($this->password, PASSWORD_DEFAULT)."\n";

来了。 “\n”。换行。我从一个示例中获取了我的代码,出于某种原因,它就在那里。当我更新数据库时,换行符被删除了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-16
    • 2018-01-04
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多