哪种 PHP 登录方式是最好的


Which way of a PHP login is the best way?

我正在编写一个PHP脚本,我需要登录。所以我想用用户名和密码检查输入。最好的方法是通过执行查询来比较帖子数据是否与数据库中的数据相同(SQL函数"like"),这是最好的方法吗?之后,我计算 mysql 行。如果为零,我拒绝登录。如果是,我允许登录。

这是常见和正确的方法还是有更好的方法?我想拥有最好的现代方式。这也是我使用HTML5的原因。

我代码的某些部分。为将来的 Cookie 登录设置 Cookie,并在会话中设置尝试,以便在尝试超过一定登录次数时显示验证码。(希望你能理解一点)

登录调用

 if($this->check_signin_errors()) {
    if($this->signin($this->user_email, sha1($this->user_pass))) { //$user_pass hashed
      header("Location: /account/");
      exit();
    } else {
      $this->generate_captcha();  
    }
    return true;
  }

登录功能

  private function signin($user_email, $user_pass) {
    global $con;
    $query = mysqli_query($con, "SELECT *, COUNT(id) FROM `accounts` WHERE `user_email` = '".mysqli_real_escape_string($con, $user_email)."' AND `user_pass` = '".mysqli_real_escape_string($con, $user_pass)."' AND access_level >= '0'");
    $result = mysqli_fetch_assoc($query);
    if($result['COUNT(id)'] > 0) {
      $_SESSION['account_logged']        = true;
      $_SESSION['user_id']               = $result['id'];
      $_SESSION['user_email']            = $result['user_email'];
      $_SESSION['user_pass']             = $result['user_pass'];
      $_SESSION['access_key']            = $result['access_key'];
      $_SESSION['access_level']          = $result['access_level'];
      $this->set_cookie('cookie_name', '1/'.$_SESSION['user_email'].'/'.$_SESSION['user_pass'], 7776000);
      $_SESSION['attempt'] = 1;
      return true;
    }   
    $_SESSION['account_logged'] = false;
    $_SESSION['attempt'] = $_SESSION['attempt'] + 1; 
    $this->throw_error(5);  
    return false;    
  }

最新的方法是使用 PHP 5.5 密码哈希函数。

因为不是每个人都使用 5.5,所以有一个库可以在早期的 PHP 版本中实现它。

因为

散列密码使用动态"盐",一个随机字符串,为每个用户单独生成,所以登录时你实际上需要读取用户数据库来获取当前哈希,因为当你想比较登录密码时,你需要哈希作为password_verify()函数的第二个输入。

所以实际上,如果您在数据库中找到用户,您就会尝试(不要在此处使用"LIKE",这是用于使用占位符进行搜索 - 您的用户应该能够正确输入他的用户名)。如果未找到:无登录名。如果找到两个:您应该为用户名添加唯一索引,否则您将有两个同名的用户。

如果找到一个条目,你阅读它,比较哈希,然后允许他进一步。