Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.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:密码\u散列和密码\u验证不起作用_Php_Mysql - Fatal编程技术网

php:密码\u散列和密码\u验证不起作用

php:密码\u散列和密码\u验证不起作用,php,mysql,Php,Mysql,我在使用password\u hash和password\u verify时遇到了一些问题,我有下面的代码,在我看来应该可以很好地工作。但是当用户登录时,password\u verify总是返回false。任何帮助都将不胜感激 密码注册脚本 $passVerifyString = $_GET["verify"]; $resetPasswordOne = $_POST['inputPasswordOne']; $resetPasswordTwo = $_POST['inputPasswordT

我在使用password\u hash和password\u verify时遇到了一些问题,我有下面的代码,在我看来应该可以很好地工作。但是当用户登录时,password\u verify总是返回false。任何帮助都将不胜感激

密码注册脚本

$passVerifyString = $_GET["verify"];

$resetPasswordOne = $_POST['inputPasswordOne'];
$resetPasswordTwo = $_POST['inputPasswordTwo'];

if($resetPasswordOne != $resetPasswordTwo){
    $resetError = "The passwords do not match";
}
else {
    if (isset($_POST['submit'])) {
        $updatedPass = password_hash($resetPasswordOne, PASSWORD_DEFAULT);
        $passUpdateSql = "UPDATE companyUsers SET userPass='$updatedPass', passVerify='' WHERE passVerify='$passVerifyString'";

    if (mysqli_query($db, $passUpdateSql)) {
        $resetError = "Your password has been sucessfully reset";
    } 
    }

}
用户登录脚本(简化版)


谢谢大家,我知道这段代码没有遵循最好的安全协议,这只是我保护它之前的测试版本。

您的SQL语句没有将包含的变量视为变量。试试这个:

  $passUpdateSql = "UPDATE companyUsers 
                    SET userPass=".$updatedPass.", passVerify='' 
                    WHERE passVerify=".$passVerifyString;

正如您所提到的,这种使用SQL的方式是不安全的,很容易受到攻击。您应该改用绑定。

根据文档,请确保密码列的varchar(60)最小

此外,您可以尝试对密码进行另一次哈希,看看是否可以将其与存储在DB中的值进行比较。附言:这只是为了测试

大概是

if(密码\u散列($password,password\u DEFAULT)==$hash){
呼应“通行证”;
}
否则{
echo“hash$hash,password_hash($password,password_DEFAULT)”;
}

我知道这不是必需的,但要求您进行测试只是为了确认从DB vs password_hash()中获得的值。因为verify正在使用相同的函数

当我查看数据库时,该行正在使用我的当前代码进行更新,并以相同的方式使用相同的结果(带或不带“$variable”)。您需要对其进行调试,以确保使用var_dump($row)从数据库中提取正确的信息;退出();在运行password_verify()之前,确保正确填充$userId和$hash;他们当然是,用var_dump运行,并得到了准确的信息。我可以问一下-你怎么知道它没有验证?您确定header()调用没有抛出错误吗?你的控制台说什么?我会删除header()并将您的真假声明作为“工作”的回音;“和echo”失败了"; 因此,您可以清楚地看到password\u verify函数是否工作。显然,StripSlashes会更改密码,并且不会阻止SQL注入。在正确的代码中永远不需要stripslashes。一直使用。谢谢你,我在一些早期测试中留下了这些,我的错误!不幸的是,我的情况仍然没有改变。请检查存储密码哈希的列的长度,并确保它至少为varchar(60)@AshTaylor。您的代码易受SQL注入攻击。请把这个修好。
  $passUpdateSql = "UPDATE companyUsers 
                    SET userPass=".$updatedPass.", passVerify='' 
                    WHERE passVerify=".$passVerifyString;
PASSWORD_DEFAULT - Use the bcrypt algorithm (default as of PHP 5.5.0). Note that this constant is designed to change over time as new and stronger algorithms are added to PHP. For that reason, the length of the result from using this identifier can change over time. Therefore, it is recommended to store the result in a database column that can expand beyond 60 characters (255 characters would be a good choice).