Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.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验证出现问题,在一种情况下总是返回true,在另一种情况下总是返回false_Php_Password Hash - Fatal编程技术网

Php 密码\u哈希和密码\u验证出现问题,在一种情况下总是返回true,在另一种情况下总是返回false

Php 密码\u哈希和密码\u验证出现问题,在一种情况下总是返回true,在另一种情况下总是返回false,php,password-hash,Php,Password Hash,我使用密码散列来保护数据库中的密码,但当我使用密码验证时,它不匹配。在第一种情况下,我使用password\u verify来验证用户的连接,它总是返回true,即使它不是好的密码。在第二种情况下,我使用password\u-verify当用户想要更改其密码时,会要求他提供实际密码以进行更改。在这种情况下,它总是返回false,即使我使用与连接相同的方式进行密码验证 在我的数据库中,密码存储为VARCHAR60。我也试过VARCHAR255,没什么区别 以下是用户创建帐户时如何使用密码\u散列:

我使用密码散列来保护数据库中的密码,但当我使用密码验证时,它不匹配。在第一种情况下,我使用password\u verify来验证用户的连接,它总是返回true,即使它不是好的密码。在第二种情况下,我使用password\u-verify当用户想要更改其密码时,会要求他提供实际密码以进行更改。在这种情况下,它总是返回false,即使我使用与连接相同的方式进行密码验证

在我的数据库中,密码存储为VARCHAR60。我也试过VARCHAR255,没什么区别

以下是用户创建帐户时如何使用密码\u散列:

if(isset($_POST['username']) && isset($_POST['password']) && isset($_POST['psw-confirmation'])) {

        $username = htmlspecialchars($_POST['username']);
        $password = htmlspecialchars($_POST['password']);
        $pswConfirmation = htmlspecialchars($_POST['psw-confirmation']);

        if($password == $pswConfirmation) {

            // Connection to database
            require('database-connection.php');

            $request = $database->prepare("SELECT * FROM users WHERE username = :username");
            $request->execute(array(
                ":username" => $username
            ));
            $return = $request->fetch();

            // If the username doesn't exist yet in the database
            if(!$return) {
                $request->closeCursor();

                $hash = password_hash($password, PASSWORD_BCRYPT);

                $addProfile = $database->prepare("INSERT INTO users(username, password) VALUES(:username, :password)");
                $addProfile->execute(array(
                    ":username" => $username,
                    ":password" => $hash
                ));
我想这部分工作正常,因为我的数据库中有一个哈希密码:$2y$10$AFV2ZOUZIRBHS30TCRX9UYZDNMGSJWFFUBXMO876T/9nJ8UDQJRi

以下是我如何验证连接的密码:

if(isset($_POST['username']) && isset($_POST['password'])) {

        $username = htmlspecialchars($_POST['username']);
        $password = htmlspecialchars($_POST['password']);

        // Connection to database
        require('database-connection.php');

        $request = $database->prepare("SELECT * FROM users WHERE username = :username");
        $request->execute(array(
            ":username" => $username
        ));
        $return = $request->fetch();
        $hash = $return['password'];

        // If the username exists in the database
        if($return) {

            // And if the password match            
            if(password_verify($password, $hash)) { 
                echo "connected";
            }
下面是当用户想要更改密码时如何验证密码: ifisset$_POST['actual-psw']和isset$_POST['new-psw']和isset$_POST['confirm-psw']{

        $actualPsw = htmlspecialchars($_POST['actual-psw']);
        $newPsw = htmlspecialchars($_POST['new-psw']);
        $confirmPsw = htmlspecialchars($_POST['confirm-psw']);

        // Connection to database
        require('database-connection.php');

        $request = $database->prepare("SELECT * FROM users WHERE id = :id");
        $request->execute(array(
            ':id' => $_SESSION['id']
        ));
        $return = $request->fetch();
        $hash = $return['password'];

        if(password_verify($actualPsw, $hash)) {
            echo "success";
        } else {
            echo "fail";
        }
$\u会话['id']正在返回实际用户的正确id


我不明白为什么它不起作用,这让我更加困惑,在一种情况下它总是正确的,而在另一种情况下它总是错误的,因为我在这两种情况下使用了相同的方法

我有一个database-connection.php文件:

$host = 'localhost';
$dbname = 'japonwebsite';
$user = 'root';
$password = 'mysql';

try
{
  $database = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $user, 
  $password);
}
catch (Exception $e)
{
  die('Erreur : ' . $e->getMessage());
}
我在需要连接到数据库的所有页面上都包含了这个文件,所以我将它包含在向数据库添加用户和验证登录的页面上

问题是,在这两个页面上,我都在做$password=$\u POST['password'];以存储用户在登录或注册表单上输入的密码变量


在那之后,我做了include'database-connection.php';以连接到数据库。因此$password始终等于mysql,因为我在database-connection.php中也有一个变量$password。因此,我总是在数据库中添加mysql的散列,并且总是验证数据库中的散列是否等于mysql,因此它总是正确的ust在数据库连接中重命名了变量$password来修复它!

我知道这里有很多类似的问题,即使是在stackoverflow之外,但没有一个解决了我的问题。