Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP可以';不要在PDO查询中使用哈希密码_Php_Mysql_Pdo_Hash_Passwords - Fatal编程技术网

PHP可以';不要在PDO查询中使用哈希密码

PHP可以';不要在PDO查询中使用哈希密码,php,mysql,pdo,hash,passwords,Php,Mysql,Pdo,Hash,Passwords,我目前是一名3年级的网络开发专业学生,在学校的一个项目中,我们必须使用PDO和哈希函数构建一个具有更改密码功能的网站,但是我遇到了一个我自己无法解决的问题,我也没有在google和stackoverflow上发现任何类似的问题 我们必须在数据库中存储2个密码,旧密码(用户最后使用的密码);以及他们的当前密码(将用于登录。) 所有密码都使用标准PHP哈希(password_hash()方法)存储 更改用户密码时,我必须从数据库中获取当前密码(用于登录的密码),并将其移动到oldpassword(上

我目前是一名3年级的网络开发专业学生,在学校的一个项目中,我们必须使用PDO和哈希函数构建一个具有更改密码功能的网站,但是我遇到了一个我自己无法解决的问题,我也没有在google和stackoverflow上发现任何类似的问题

我们必须在数据库中存储2个密码,旧密码(用户最后使用的密码);以及他们的当前密码(将用于登录。)

所有密码都使用标准PHP哈希(password_hash()方法)存储

更改用户密码时,我必须从数据库中获取当前密码(用于登录的密码),并将其移动到oldpassword(上次使用的密码)列,同时将新的哈希密码放入数据库

问题是:我似乎无法在PDO查询中使用散列密码,我需要指出的是,我以前从未使用过PDO,但在谷歌搜索了一段时间后,我认为我的查询中没有错误,但在传递给该查询的数据中没有错误

这是我从数据库中获取所有当前数据的地方

/*prepare and execute a query*/
$sqlStatement = $this->db->prepare("SELECT username, password, oldpassword FROM users WHERE username = :username");
$sqlStatement->bindParam(":username", $username, PDO::PARAM_STR);
$sqlStatement->execute();

/*Fetch the query results*/
$values = $sqlStatement->fetch(PDO::FETCH_ASSOC);
这就是我尝试使用PDO SQL查询将数据存储到数据库中的地方

/*Create variables to use in querys*/
$queryPassword = password_hash($password, PASSWORD_DEFAULT);

/*Update the passwords*/
$sqlStatement2 = $this->db->prepare("UPDATE password, oldPassword VALUES (:password, :oldpassword)");
$sqlStatement2->bindParam(":password", $queryPassword, PDO::PARAM_STR);
$sqlStatement2->bindParam(":oldpassword", $values["password"] , PDO::PARAM_STR);
$sqlStatement2->execute();
$password和$username是从表单传递到函数以更改用户密码的变量

public function updateUserPasswords($username, $password){
我觉得奇怪的是:如果我对$values[“password”]进行var_转储,我会得到以下数据:
字符串(60)“$2y$10$BBCpJxgPa8K.iw9ZporxzuW2Lt478RPUV/JFvKRHKzJhIwGhd1tpa”

其中,我的查询错误提供了以下数据:
2y$10$

就好像只有散列被发送到查询。

==编辑==

发送到浏览器的SQL错误为:

Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'VALUES ('$2y$10$AC.aMG/gNV9zwGB/v/g7keW9jsZ80kuejrSh693DPuhOYChFxA6wu', '$2y$10$' at line 1' in /srv/jip/www/www.jip.nl/classes/user.class.php:92 Stack trace: #0 /srv/jip/www/www.jip.nl/classes/user.class.php(92): PDOStatement->execute() #1 /srv/jip/www/www.jip.nl/pages/first_login.php(26): User->updateUserPasswords('username', 'password') #2 {main} thrown in /srv/jip/www/www.jip.nl/classes/user.class.php on line 92

不要使用散列密码检索数据,因为每次使用时都会使用不同的salt生成新的散列

仅使用用户名检索记录,然后使用验证密码

编辑

update查询引用列,但没有表,并且没有WHERE子句:

$sqlStatement2 = $this->db->prepare("UPDATE users SET password=:password, oldPassword=:oldpassword WHERE username = :username");
$sqlStatement2->bindParam(":password", $queryPassword, PDO::PARAM_STR);
$sqlStatement2->bindParam(":oldpassword", $values["password"] , PDO::PARAM_STR);
$sqlStatement2->bindParam(":username", $username, PDO::PARAM_STR);
$sqlStatement2->execute();

使用适当的值绑定时,不要使用散列密码检索数据,因为每次使用时都会使用不同的salt生成新的散列

仅使用用户名检索记录,然后使用验证密码

编辑

update查询引用列,但没有表,并且没有WHERE子句:

$sqlStatement2 = $this->db->prepare("UPDATE users SET password=:password, oldPassword=:oldpassword WHERE username = :username");
$sqlStatement2->bindParam(":password", $queryPassword, PDO::PARAM_STR);
$sqlStatement2->bindParam(":oldpassword", $values["password"] , PDO::PARAM_STR);
$sqlStatement2->bindParam(":username", $username, PDO::PARAM_STR);
$sqlStatement2->execute();

使用适当的值绑定结果表明我的查询确实不正确,自从我上次进行更新查询以来已经有一段时间了,我将其与插入查询的格式相同


Mark Baker的解决方案还修复了从数据库检索旧密码的问题。仅使用用户名检索信息是有效的。

结果表明,我的查询确实不正确,我上次进行更新查询已经有一段时间了,我将其与插入查询的格式相同


Mark Baker的解决方案还修复了从数据库检索旧密码的问题。仅使用用户名检索信息有效。

您正在更新表中的所有密码数据库中密码字段的最大长度是多少?我猜是的7@noobie-php为什么要使用MySQL哈希函数?PHP具有比MySQL更安全的哈希函数(例如
password\u hash()
使用bcrypt进行多轮操作)。用户在表单中输入密码>表单发送>PHP哈希从表单中输入>PHP将哈希存储在数据库中。这里一切正常。你说的“查询错误”是什么?你正在更新表中的所有密码数据库中密码字段的最大长度是多少?我猜是的7@noobie-php为什么要使用MySQL哈希函数?PHP具有比MySQL更安全的哈希函数(例如
password\u hash()
使用bcrypt进行多轮操作)。用户在表单中输入密码>表单发送>PHP哈希从表单中输入>PHP将哈希存储在数据库中。这里一切都很好。你说的“查询错误”是什么?好的,谢谢你的快速响应,我会尝试一下,然后在我完成后再检查。解释得很好,逻辑性很强。where子句确实缺失,但尚未添加,因为表目前只有一个测试结果。。至于表格,它包含在$this->dballright中,感谢您的快速响应,我将尝试一下,并在完成后进行检查。解释得很好,逻辑性很强。where子句确实缺失,但尚未添加,因为表格目前只有一个测试结果。。至于表,它包含在$this->db中