如何使用 SHA1 + PDO + 预准备语句成功登录网页


How to successfully login on webpage using SHA1 + PDO + Prepared Statement?

我现在正在为弄清楚如何使用 SHA1 + PDO + 预准备语句组合而仍然能够登录网页:)所以我的问题是如何做到这一点?这是我的代码:

if (!empty($user) && !empty($password))
{
  $password = $this->doHash($user, $password);
  $stmt = $db_login->prepare("SELECT COUNT(*) FROM account WHERE username=:user AND sha_pass=:password");
  $stmt->bindValue(':user', $user, PDO::PARAM_STR);
  $stmt->bindValue(':password', $password, PDO::PARAM_STR);
  $stmt->execute();
  $results_login = $stmt->fetchAll(PDO::FETCH_ASSOC);
  if ($results_login['COUNT(*)'] > 0)      
  { 
    $_SESSION['user_name'] = $results_login['username'];
    $_SESSION['user_id'] = $results_login['id'];                  
    return true;          
  }
  else
  {
    return false;
  }
}
else
{
  return false;
}

我的函数doHash看起来像这样:

  public function doHash($user, $password)
  {
    return sha1(strtoupper($user).":".strtoupper($password));
  }

所以我的问题是:$results_login***从不使用SELECT COUNT(*)版本进行处理,并且有时会处理SELECT *版本,但并非总是如此。那么,我如何将其组合在一起以按预期工作,产生 true,并填充我需要的所有变量呢?谢谢。

您的 SQL 语句

只是计数,它没有选择用户名和 id,您需要将其用作您的 SQL 语句,或类似的东西:

"SELECT * FROM account WHERE username=:user AND sha_pass=:password"

对于密码绑定,以下内容应该可以正常工作。 我也会使用rowCount,而且只使用fetch,而不是fetchAll。 试一试,看看它是否有效。

$stmt->bindValue(':password', doHash($user,$password), PDO::PARAM_STR);
$stmt->execute();
if($stmt->rowCount()==1){
    $results_login=$stmt->fetch(PDO::FETCH_ASSOC);
    $_SESSION['user_name'] = $results_login['username'];
    $_SESSION['user_id'] = $results_login['id'];                  
    return true;          
}else{
    return false;
}