Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.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_Authentication_Hash - Fatal编程技术网

Php 在pdo登录中添加密码哈希

Php 在pdo登录中添加密码哈希,php,authentication,hash,Php,Authentication,Hash,我无法在注册代码中添加密码哈希。我是PDO新手,我尝试了不同的方法,但无法使用密码哈希进行有效注册! 有人能帮我吗?这是我的代码: <?php include('header.php'); // Check if logged in if($user->is_loggedin()!="") { $user->redirect('home.php'); } $error=''; if(isset($_POST['btn-signup']))

我无法在注册代码中添加密码哈希。我是PDO新手,我尝试了不同的方法,但无法使用密码哈希进行有效注册! 有人能帮我吗?这是我的代码:

<?php
  include('header.php');  
  // Check if logged in
if($user->is_loggedin()!="")
{
    $user->redirect('home.php');
}
$error='';
if(isset($_POST['btn-signup']))
{


// trim empty spaces on inserted data
   $uname = trim($_POST['name']);
   $umail = trim($_POST['email']);
   $upass = trim($_POST['password']); 
   $repeat_password = trim($_POST['repeat_password']); 
   
//  validate username
   if($uname=="") {
      $error.= "provide username ! <br>"; 
   }
//  validate e-mail
   else if($umail=="") {
      $error.= "provide email id ! <br>"; 
   }
   else if(!filter_var($umail, FILTER_VALIDATE_EMAIL)) {
      $error.= 'Please enter a valid email address ! <br>';
   }
//  validate password
   else if($upass=="") {
      $error.= "provide password ! <br>";
   }
   else if(strlen($upass) < 6){
      $error.= "Password must be atleast 6 characters <br>"; 
   }
      else if( $upass!=$repeat_password){
      $error.= "Password Does Not Match <br>"; 
   }
   else
   {
    
    // check if email is already taken 
      try
      {
        //   prepare statement
         $stmt = $DB_con->prepare("SELECT email FROM users WHERE  email=:umail");
         $stmt->execute(array(':umail'=>$umail));
         $row=$stmt->fetch(PDO::FETCH_ASSOC);
    
         if($row['email']==$umail) {
            $error.= "sorry email id already taken ! <br>";
         }
        //  if everything is validated save data
         else
         {
            if($user->register($uname,$umail,$upass)) 
            {
                
                $_SESSION['success']='You have been Registered  Successfully';
                $user->redirect('login.php');
            }
         }
     }
    //  set the error mode
     catch(PDOException $e)
     {
        echo $e->getMessage();
     }
  } 
}

我想首先指出几件事:

  • 不要使用修剪到用户密码。除非您想限制用户在密码中输入空格

  • 进行比较时使用===。它更好,因为它同时检查数据类型。例如,如果有“2”和2,并且使用==运算符,则它等于。检查数据类型是一种很好的做法,因为它可以防止很多错误的发生

  • 至于你们想得到答案的问题是什么

    您在任何时候都不使用密码\u散列函数。您只能将原始密码分配给变量,并将此变量分配给bind_param函数

    $new_password = $upass;
    
    应该是

    $new_password = password_hash($upass, PASSWORD_DEFAULT);
    
    但是,我不建议使用PASSWORD\u DEFAULT,因为使用PASSWORD\u ARGON2I可以获得更安全的哈希。您可以从中查看有关密码\u哈希的更多信息

    为了给您提供更多帮助:当您想验证用户在登录时输入的密码是否正确时,您需要使用password_verify()。它将哈希值和用户输入的密码进行比较,如果正确,此函数将返回true

    例如:

    $login_status = password_verify($_POST['password'], $user_password_from_database);
    if($login_status === true) {//set session etc...}
    

    您可以阅读有关密码验证的更多信息“…但是pw不会保存在我的sql数据库中”-在这种情况下发生了什么?有错误吗?行是否插入了其余数据,但密码为空?您的密码列是否足够长以存储哈希字符串?我同意El_Vanja的观点。你注释掉的那行代码只会用它的散列替换密码,不会有太多的错误。我假设您在实际使用时注释掉了下一行(
    $new\u password=$upass;
    )。你要测试的第一件事是你是否真的得到了一个哈希:
    echo$new\u密码。如果是这种情况,请检查
    $stmt->execute()的结果。基本检查。问题:为什么
    返回$stmt
    函数寄存器()
    ?不应该是:
    $stmt->execute()
    $login_status = password_verify($_POST['password'], $user_password_from_database);
    if($login_status === true) {//set session etc...}