PHP密码\u验证不工作需要获取特定于域的结果

PHP密码\u验证不工作需要获取特定于域的结果,php,mysql,hash,Php,Mysql,Hash,因此,在我的函数中,我有一个连接,该查询将显示一行和一列。然后,我想运行密码\u verify()这就是我正在努力的地方。作为第一个参数,我放置了用户输入的$pass,然后我需要从数据库获取结果,将其放置在第二个参数中 我该怎么做 function login($user, $pass){ $conn = connect(); $query = "SELECT password FROM account WHERE username = '$user' AND password

因此,在我的函数中,我有一个连接,该查询将显示一行和一列。然后,我想运行
密码\u verify()
这就是我正在努力的地方。作为第一个参数,我放置了用户输入的
$pass
,然后我需要从数据库获取结果,将其放置在第二个参数中

我该怎么做

function login($user, $pass){
    $conn = connect();
    $query = "SELECT password FROM account WHERE username = '$user' AND password = '$pass'";
    $result = mysqli_query($conn, $query);
    if (mysqli_num_rows($result)=== 1){
        password_verify($pass, "$row[password]");
        session_start();

如果一切正常,
account
表中的
password
字段存储哈希密码

我想函数的参数
$pass
是一个普通密码

那么,你的问题是什么

SELECT password FROM account WHERE username = '$user' AND password = '$pass'
永远找不到任何用户,因为您尝试使用普通密码查找用户

// Login function
function login($user, $pass)
{
  // Search the user by username
  $conn = connect();
  $query = "SELECT password_hashed FROM account WHERE username = '$user'";
  $result = mysqli_query($conn, $query);

  if (mysqli_fetch_row($result))
  {
    // We found the user, check if password is correct
    if(password_verify($pass, $result["password_hashed"]))
    {
      return true;
    }
    else
    {
      return false;
    }
  }
  else
  {
    // We didn't find the user
    return false;
  }
}
此外-您的
$row
变量未定义

解决方案是什么:

function login($user, $pass){
    $conn = connect();
    // do not add password to query
    $query = "SELECT password FROM account WHERE username = '$user'";
    $result = mysqli_query($conn, $query);
    if (mysqli_num_rows($result) === 1){
        // define $row
        $row = mysqli_fetch_assoc($result);

        // set proper quotes and compare password 
        // from db with password input by user            
        if (password_verify($pass, $row["password"])) {
            // do something if password is correct
            session_start();

当然,不要直接将值传递给查询,而是开始使用准备好的语句

当有人在您的网站上注册时,您必须使用内置的PHP函数password\u hash()。此外,我建议在数据库中将其命名为“password\u hash”,而不是“password”,以避免混淆

当有人试图登录您的网站时,您必须使用内置的PHP password_verify()将哈希密码与密码进行比较

// Login function
function login($user, $pass)
{
  // Search the user by username
  $conn = connect();
  $query = "SELECT password_hashed FROM account WHERE username = '$user'";
  $result = mysqli_query($conn, $query);

  if (mysqli_fetch_row($result))
  {
    // We found the user, check if password is correct
    if(password_verify($pass, $result["password_hashed"]))
    {
      return true;
    }
    else
    {
      return false;
    }
  }
  else
  {
    // We didn't find the user
    return false;
  }
}
-为什么要在将密码存储到数据库中时对其进行哈希处理?因为当您存储密码而不进行散列时,数据库中的密码与用户注册时键入的密码完全相同。因此,当黑客进入数据库时,他会看到每个用户的密码。如果对密码进行散列,PHP会将密码完全转换为其他内容,这样,当黑客进入数据库时,他不会看到密码,而是看到其他内容


-当用户登录时,密码验证功能绝对是一种方法。当您输入从用户处收到的数据(通过$\u POST、$\u GET、$\u SESSION,…)时,请不要忘记添加额外的安全性,因为当用户键入以下名称时:my name“投递表账户他们将删除所有帐户信息。

因为在db中存储哈希密码?哇。。。你应该读一本PHP书籍或其他东西。忘记从查询结果中获取数据
密码\u验证
返回true或false-你不能仅仅运行它并希望得到神奇的结果。你的观点(非常正确)关于不信任用户提供的数据,您的代码仍然容易受到SQL注入的攻击。这是因为问题在于密码\u verify()不起作用,而不是SQL注入。人们都很懒惰。他们只是简单地复制和粘贴你的代码。函数本身不使用$\u GET或$\u POST数据。如果他选择这样做并完成了脚本,那么脚本将很脆弱,但至少他看到了这样做有多么容易的一个例子。你应该以身作则,修改代码以使用准备好的语句。很多人只是简单地复制粘贴它,而没有读你的最后一句话。