关于PHP参数化查询和密码\u散列的Dubts

关于PHP参数化查询和密码\u散列的Dubts,php,mysql,Php,Mysql,我是PHP新手。我使用sha-1在我的数据库中存储密码,我只在存储的sha-1和根据用户插入的密码计算的sha-1之间进行检查。现在我尝试使用password\u hash()和password\u verify() 我对我的代码有一个问题: $user = htmlspecialchars($_POST["username"]); $passw = password_hash($_POST["password"], PASSWORD_DEFAULT); if ($stmt = $

我是PHP新手。我使用sha-1在我的数据库中存储密码,我只在存储的sha-1和根据用户插入的密码计算的sha-1之间进行检查。现在我尝试使用password\u hash()和password\u verify()

我对我的代码有一个问题:

  $user = htmlspecialchars($_POST["username"]);
  $passw = password_hash($_POST["password"], PASSWORD_DEFAULT);

  if ($stmt = $conn->prepare("
                                SELECT Password
                                FROM Users
                                WHERE Username = ?
                                LIMIT 1
                            ")) {

      $stmt->bind_param("s", $user);

      $stmt->execute();

      $stmt->bind_result($passwDB);

      $stmt->fetch();

      if( password_verify($passwDB,$passw) ){

          if(!isset($_SESSION['login'])){
            session_start();
          }

          $_SESSION['login'] = $user;    
      }

      $stmt->close();
  }

    $conn->close();
这个代码对吗?目前,我的数据库(sql)中的密码没有哈希。是否有可遵循的最佳实践

Ps:htmlspecialchars()在这种情况下有用吗


谢谢(我的英语很抱歉!)

htmlspecialchars
用于将输出转义到浏览器。散列数据库中的所有密码并删除纯文本
sha-1将密码存储在我的数据库中
我的数据库中的密码(sql)没有散列
似乎相互矛盾。您的方法错误:您需要将密码散列一次,然后将散列存储在数据库中。然后只使用
password\u verify()
根据数据库哈希检查POST值。不要使用
htmlspecialchars
,除非您想将值输出到html。那么,我应该在数据库中存储salt密码,从php代码中删除password\u hash()?然后,我从DB中获取salt值,并将其与用户插入的密码进行比较,密码为_verify()?但是salted password不应该每次都更改?password_verify()的参数是用户输入的明文密码,然后是数据库中的密码散列,而不是反过来,也不是用户输入的密码的散列,“否”,htmlspecialchars在这里没有用;将输入的数据存储在数据库中;在适当的情况下,在显示数据时使用htmlspecialchars
htmlspecialchars
用于将输出转义到浏览器。散列数据库中的所有密码并删除纯文本
sha-1将密码存储在我的数据库中
我的数据库中的密码(sql)没有散列
似乎相互矛盾。您的方法错误:您需要将密码散列一次,然后将散列存储在数据库中。然后只使用
password\u verify()
根据数据库哈希检查POST值。不要使用
htmlspecialchars
,除非您想将值输出到html。那么,我应该在数据库中存储salt密码,从php代码中删除password\u hash()?然后,我从DB中获取salt值,并将其与用户插入的密码进行比较,密码为_verify()?但是salted password不应该每次都更改?password_verify()的参数是用户输入的明文密码,然后是数据库中的密码散列,而不是反过来,也不是用户输入的密码的散列,“否”,htmlspecialchars在这里没有用;将输入的数据存储在数据库中;在适当的情况下,在显示数据时使用htmlspecialchars