繁体   English   中英

PHP登录系统密码哈希和密码验证

[英]Php Login System Password Hash & Password Verify

我正在尝试使用password_hash()password_verify()创建一个登录系统(已经有完整的注册系统),但是它对我不起作用。 我一直试图在整个上午找到答案,但似乎无法解决问题,我看了代码课程教程,阅读了博客文章,却一无所获。 我一直在关注最该教程是这一个

<!-- login -->
<?php
if($_SERVER['REQUEST_METHOD'] == "POST") {
    $errors = array();
    error_reporting(E_ALL); 
    ini_set('display_errors', 1);

    //Basic validation
    if(empty($_POST['username'])){
        $errors[] = "Please enter your username";
        }else{
        $username = $mysqli->real_escape_string($_POST['username']);
        }

            if(empty($_POST['password'])){
            $errors[] = "Please enter your password";
            }else{
            $password = trim($_POST['password']);
            }

            if (empty($errors)) {
            $sql = "SELECT * FROM users WHERE username = '$username'";
            $result = $mysqli->query($sql);
            if ($result->num_rows === 1) {
            $row = $result->fetch_array(MYSQLI_ASSOC);
            if(password_verify($password, $row['password'])) {
                echo 'test';
            $_SESSION['user']['user_id'] = $row['user'];
            header("Location: google.com");
            exit();
            }else{
            $errors[] = "The username or password do not match";
            }
            }else{
            $errors[] = "The username or password do not match";
            }
        }
}
?>

<!-- register -->
<?php
    if($_SERVER['REQUEST_METHOD'] == "POST") {
        $username = mysqli_real_escape_string($conn, $_POST['username']);
        $password = $_POST['password'];
        $hashed_password = password_hash($password, PASSWORD_DEFAULT);
        $confirm_password = mysqli_real_escape_string($conn, $password);
        $ip = $_SERVER['REMOTE_ADDR'];

        if(empty($username) || empty($password) || empty($confirm_password)) {
            $error = "Fill in the missing fields";
        } else {
            $sql = "INSERT INTO users VALUES('', '$username', '$hashed_password', '$ip', 'User')";
            if($conn->query($sql) === TRUE) {
                $error = "Your account has been created.";
            } else {
            $error = "Your account has not been created, please try again later.";  
        } 
    }
}
?>

最终结果产品应该成功登录并重定向,我正在使用PHP 5.6并在localhost XAMPP上运行。

您永远不会得到匹配,因为您正在使用

 $password =mysqli_real_escape_string($conn, $_POST['password']); 

存储密码,然后在验证中不使用它。 相反,您使用

$password = trim($_POST['password']);

在散列之前,请确保您不要转义密码或对密码使用任何其他清除机制。 这样做会更改密码,并导致不必要的附加编码。 password_hash()函数可以生成一些很长的文本( 当前默认值为60个字符 ),因此请确保数据库中的字段足够大以容纳哈希。 现在设置更大的字段将允许所需的长度。 PHP团队正在向该方法添加更多算法,这意味着哈希可以并且将会增长。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM