Hash 在注册表和帐户设置中哈希密码

Hash 在注册表和帐户设置中哈希密码,hash,passwords,Hash,Passwords,当我使用自己的帐户登录测试脚本时,我会遇到登录错误。你认为对密码进行两次哈希运算是一种糟糕的做法吗 我在我的网站上对用户密码进行了两次哈希运算。一次,当他们注册时,一次,当他们在帐户更新中更新密码时。另外,我正在使用bcrypt方法,bcrypt的成本在两个哈希上都是10,而我在本地主机服务器上 ///// this is the code in register.php page <?php if(isset($_POST['registeruser'

当我使用自己的帐户登录测试脚本时,我会遇到登录错误。你认为对密码进行两次哈希运算是一种糟糕的做法吗

我在我的网站上对用户密码进行了两次哈希运算。一次,当他们注册时,一次,当他们在帐户更新中更新密码时。另外,我正在使用bcrypt方法,bcrypt的成本在两个哈希上都是10,而我在本地主机服务器上

    ///// this is the code in register.php page
    <?php      
    if(isset($_POST['registeruser']))  {
        session_start();
        $FName = $_POST['regfname'];
        $LName = $_POST['reglname'];
        $Email = mysqli_real_escape_string($conn, $_POST['regemail']);
        $origignalpassword = preg_replace('#[^a-z0-9_]#i', '', 
                             $_POST['regpassword']);
        $Passwordw = $_POST['confirmedpassword'];
        $infosql = "SELECT * FROM users WHERE useremail = '".$Email."'";
        $result = mysqli_query($conn,$infosql);
            if(mysqli_num_rows($result)>=1)
                   {
                    echo "Email already taken.";
                   }
                   else if(mysqli_num_rows($result) !=1 && $Passwordw == 
                   $origignalpassword) {
                   $Passwordhash = password_hash($Passwordw, 
                                   PASSWORD_BCRYPT, array('cost' => 10));
                    $sql = $conn->query("INSERT INTO users(firstname, 
                    lastname, useremail, Passwordcell) Values('{$FName}', 
                    '{$LName}','{$Email}','{$Psswordhash}')");
                        header('Location: login.php');
                    } else {
                        echo 'Please check your password:' . '<br>';
                    } 
             }
    ?>


    //// Below code is the code in my update.php page


    <?php session_start();  
        if(isset($_SESSION['user_id'])) { 
            } else {
                header('Location: login.php'); 
            }

        $user = $_SESSION['userid'];
        $myquery = "SELECT * FROM users WHERE `userid`='$user'";
        $result = mysqli_query($conn, $myquery);
        $row = mysqli_fetch_array($result, MYSQLI_BOTH);

        $_SESSION['upd_fnames'] = $row['firstname'];
        $_SESSION['upd_lnames'] = $row['Lastname'];
        $_SESSION['upd_emails'] = $row['useremail'];
        $_SESSION['upd_passwords'] = $row['Passwordcell'];
        $_SESSION['upd_phone'] = $row['phonenum'];
        $_SESSION['upd_bio'] = $row['biography'];   
    ?>
    <?php 
    if (isset($_POST['updateme'])) {
        $updfname = $_POST['upd_fnames'];
        $updlname = $_POST['upd_lnames'];
        $updemail = $_POST['upd_emails'];
        $updphone = $_POST['upd_phone'];
        $upd_pswd = $_POST['upd_passwords'];        
        $biography = $_POST['update_biography'];

        $Pswod = password_hash($upd_pswd, PASSWORD_BCRYPT, 
                 array('cost' => 10));
        $sql_input = $mysqli->query("UPDATE users SET firstname = '{$updfname}', Lastname = '{$updlname}', Phonenum = '{$updphone}', useremail = '{$updemail}', Passwordcell = '{$Pswod}', biography = '{$biography}' WHERE userid=$user");

        header('Location: Account.php');
    }  
    else 
    {

    }
?>
///这是register.php页面中的代码

您的问题可能只是注册脚本中的输入错误,而不是您编写的
$Passwordhash

"INSERT INTO users(..., Passwordcell) Values(...,'{$Psswordhash}')"
尽管如此,您的代码还有其他问题,既然您要求提供建议,我想与您分享我的想法

  • 可能最大的问题是,您的代码容易受到SQL注入的攻击。尽快切换到prepared语句,编写代码将比像您那样构建查询更加容易,MYSQLI和PDO都支持它。这可以给你一个开始
  • 不应对密码进行消毒。删除行
    $origignalpassword=preg_replace(“#[^a-z0-9#]\i',”,$\u POST['regpassword'])
    ,只需将输入直接传递到散列函数
    密码散列($\u POST['regpassword',密码默认值)
    。password_hash()函数可用于任何类型的输入
  • 在每次重定向之后放置一个出口是一个好习惯,否则脚本将继续执行<代码>标题('Location:login.php',true,303);退出
  • 你真的有理由将用户信息放入会话中吗?而不是
    $\u SESSION['upd\u fnames']=$row['firstname']我会根据需要从数据库中获取信息。通过从数据库中获取它,您可以确保信息是实际设置的(不是空的)并且是最新的,您可以避免一种状态,从而获得更多的REST-full
  • 最后但并非最不重要的一点是,我建议遵循一些样式规则,比如变量名的开头总是以小写字母开头。您可以避免一些愚蠢的打字错误,这会使您的代码更具可读性

  • 您的问题可能只是注册脚本中的输入错误,而不是您编写的
    $Passwordhash

    "INSERT INTO users(..., Passwordcell) Values(...,'{$Psswordhash}')"
    
    尽管如此,您的代码还有其他问题,既然您要求提供建议,我想与您分享我的想法

  • 可能最大的问题是,您的代码容易受到SQL注入的攻击。尽快切换到prepared语句,编写代码将比像您那样构建查询更加容易,MYSQLI和PDO都支持它。这可以给你一个开始
  • 不应对密码进行消毒。删除行
    $origignalpassword=preg_replace(“#[^a-z0-9#]\i',”,$\u POST['regpassword'])
    ,只需将输入直接传递到散列函数
    密码散列($\u POST['regpassword',密码默认值)
    。password_hash()函数可用于任何类型的输入
  • 在每次重定向之后放置一个出口是一个好习惯,否则脚本将继续执行<代码>标题('Location:login.php',true,303);退出
  • 你真的有理由将用户信息放入会话中吗?而不是
    $\u SESSION['upd\u fnames']=$row['firstname']我会根据需要从数据库中获取信息。通过从数据库中获取它,您可以确保信息是实际设置的(不是空的)并且是最新的,您可以避免一种状态,从而获得更多的REST-full
  • 最后但并非最不重要的一点是,我建议遵循一些样式规则,比如变量名的开头总是以小写字母开头。您可以避免一些愚蠢的打字错误,这会使您的代码更具可读性

  • 嘿,巴德,谢谢你的回答,但是你能进一步解释一下准备好的Mysqli声明吗。因为我不明白。例如,使用下面的代码,如果用户的电子邮件或密码中包含字符串、整数和字符,我如何确保电子邮件和密码是否被接受
    $sql=“从用户中选择*,其中useremail=?”,userpassword=?”;$statement=$conn->prepare($sql);$statement->bind_参数('ss',$u_email,$password);$sql->execute();$result=$sql->get_result()谢谢。@raminkamal-无法通过查询检查密码,因为您只存储了一个盐哈希。登录脚本的必要步骤是1)按用户搜索密码哈希
    从_users中选择userpassword,其中useremail=?
    。2) 如果找到用户,则可以读取存储在数据库中的密码哈希。3) 在最后一步中,您可以使用code
    $passwordIsCorrect=password\u verify($password,$existingHashFromDb)中找到的密码散列来验证输入的密码。你可以在my.Hey bud上找到一个更深入的解释。谢谢你的回答,但是你能进一步解释一下准备好的Mysqli声明吗。因为我不明白。例如,使用下面的代码,如果用户的电子邮件或密码中包含字符串、整数和字符,我如何确保电子邮件和密码是否被接受
    $sql=“从用户中选择*,其中useremail=?”,userpassword=?”;$statement=$conn->prepare($sql);$statement->bind_参数('ss',$u_email,$password);$sql->execute();$result=$sql->get_result()谢谢。@raminkamal-无法通过查询检查密码,因为您只存储了一个盐哈希。登录脚本的必要步骤是1)按用户搜索密码哈希
    从_users中选择userpassword,其中useremail=?
    。2) 如果找到用户,则可以读取存储在数据库中的密码哈希。3) 在最后一步中,您可以使用code
    $passwordIsCorrect=password\u verify($password,$existingHashFromDb)中找到的密码散列来验证输入的密码。一个更深刻的解释,你可以在我的