Php 更新字段验证密码?
好的,作为我教育的一个附带项目,我目前正在使用PHP和mysqli开发一个安全登录系统。事情一直进展顺利,但现在我遇到了一个令我的同学、老师和我感到困惑的问题 我正在通过密码散列和密码验证散列和检查我的密码 创建帐户时,所有内容都正确地存储在数据库中。然后,当我尝试使用正确的密码登录时,它会给我一个错误,即我的密码不正确 现在,关键是:当我进入PHPMyAdmin时,复制存储在数据库中的散列密码,并使用EXACT复制的密码更新密码字段。。。它起作用了。我可以按预期登录,使用我使用的密码,它不会给我任何错误 有人知道发生了什么事,以及如何解决吗 用于注册的代码:Php 更新字段验证密码?,php,mysqli,password-hash,Php,Mysqli,Password Hash,好的,作为我教育的一个附带项目,我目前正在使用PHP和mysqli开发一个安全登录系统。事情一直进展顺利,但现在我遇到了一个令我的同学、老师和我感到困惑的问题 我正在通过密码散列和密码验证散列和检查我的密码 创建帐户时,所有内容都正确地存储在数据库中。然后,当我尝试使用正确的密码登录时,它会给我一个错误,即我的密码不正确 现在,关键是:当我进入PHPMyAdmin时,复制存储在数据库中的散列密码,并使用EXACT复制的密码更新密码字段。。。它起作用了。我可以按预期登录,使用我使用的密码,它不会给
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;
}
好的,感谢所有帮助过我的人:谢谢。我的同学刚刚帮助我,他设法找到了问题所在。我现在正在打自己
$this->password = password_hash($this->password, PASSWORD_DEFAULT)."\n";
给你。“\n”。新行。我从一个示例中获取了我的代码,出于某种原因,它就在那里。当我更新数据库时,换行代码被删除。你认为没有一行代码,有人能帮你做什么?请输入代码。但是,根据哈希不允许正确登录的经验,请确保您的DB Table列设置为text或一些不会切断哈希的大数字。您的帖子从一开始就很糟糕。。。您正在使用mysqli而不是PDO。。。您使用的是什么类型的散列?另外,请提供一个代码示例,以了解您正在处理的问题@Typhomism列被设置为varchar(255),因此应该可以。@RikPronk如果您在保存哈希值之前将其打印到屏幕上,请检查保存的值是否相同?
$this->password = password_hash($this->password, PASSWORD_DEFAULT)."\n";