Php 这句话总是假的

Php 这句话总是假的,php,mysql,Php,Mysql,我为登录系统编写了这个语句,但它不工作,fetch函数工作正常,因为如果我尝试回显$hash,它看起来很好,但是如果我尝试这个verify语句,它总是返回false,即使数据库中的输入相同,数据库看起来也很好,它有varchar(255),下面是我的代码 <?php if(isset($_POST['submit'])){ include 'database.php'; $uid = mysqli_real_escape_string($conn,$_POST['uid'

我为登录系统编写了这个语句,但它不工作,fetch函数工作正常,因为如果我尝试回显$hash,它看起来很好,但是如果我尝试这个verify语句,它总是返回false,即使数据库中的输入相同,数据库看起来也很好,它有varchar(255),下面是我的代码

<?php

if(isset($_POST['submit'])){
    include 'database.php';
    $uid = mysqli_real_escape_string($conn,$_POST['uid']);
    $pass = mysqli_real_escape_string($conn,$_POST['pass']);

    $query = "SELECT * FROM user WHERE username ='$uid'";
    $tbl = mysqli_query($conn, $query);
    if (mysqli_num_rows($tbl)>0){

        $row = mysqli_fetch_array($tbl, MYSQLI_ASSOC);
        $hash = $row['password'];
        if (password_verify($pass, $hash)){
            echo "success";
        } else {
            echo "log in error";
        }
    }
}
$sql = "SELECT * FROM 'user' WHERE username ='$uid'";
    $result = mysqli_query($conn, $sql);
    $resultCheck = mysqli_num_rows($result);
}
  if ($resultCheck > 0) {
    header("Location:.../user.add.php?the inputs are already taken");
    exit();
  }
  else {
      $hashedpass = password_hash($pwd, PASSWORD_DEFAULT);
      //insert the new user to the user database
      $sql = "INSERT INTO user (userID, username, password)
      VALUES (NULL, '$uid', '$hashedpass');";
      $result = mysqli_query($conn, $sql);
      header("Location:../user.add.php?success sir");
    exit();
  }

在比较密码之前,您可能正在修改密码:

$pass = mysqli_real_escape_string($conn,$_POST['pass']);
在某些情况下,这不会有什么不同,但在某些情况下会有不同

如果我尝试回显$hash,它看起来很好

作为网页上的输出,这在人类看来可能很好,但这是否意味着这两个值是二进制等价的?不总是这样,代码的结果似乎恰恰表明了这一点

由于在SQL查询中未使用此值,因此无需转义:

$pass = $_POST['pass'];


旁注:无论如何,在SQL查询中都不应该依赖转义输入。相反,首先不要在查询中使用用户可修改的值作为代码。改用。有一些很好的例子和解释让你开始。从长远来看,您的代码将更安全、更稳定、更易于调试和维护。

您可能在比较密码之前修改密码:

$pass = mysqli_real_escape_string($conn,$_POST['pass']);
在某些情况下,这不会有什么不同,但在某些情况下会有不同

如果我尝试回显$hash,它看起来很好

作为网页上的输出,这在人类看来可能很好,但这是否意味着这两个值是二进制等价的?不总是这样,代码的结果似乎恰恰表明了这一点

由于在SQL查询中未使用此值,因此无需转义:

$pass = $_POST['pass'];


旁注:无论如何,在SQL查询中都不应该依赖转义输入。相反,首先不要在查询中使用用户可修改的值作为代码。改用。有一些很好的例子和解释让你开始。从长远来看,您的代码将更安全、更稳定、更易于调试和维护。

首先停止在密码上运行
mysqli\u real\u escape\u string
。这会改变值,从而改变结果哈希。可能值得一提的是,首先显示生成哈希的位置。如果您只想从select中选择一列,那么
select password…
而不是
select*
顺便提一下,使用
password\u verify()
做得很好。有没有其他方法可以避免sql注入?我是php新手,似乎我不知道在我的代码中使用什么以及何时使用此类函数。我总是依赖于从互联网上获得的源代码,感谢您通过停止在密码上运行
mysqli\u real\u escape\u string
来回答btwStart。这会改变值,从而改变结果哈希。可能值得一提的是,首先显示生成哈希的位置。如果您只想从select中选择一列,那么
select password…
而不是
select*
顺便提一下,使用
password\u verify()
做得很好。有没有其他方法可以避免sql注入?我是php新手,似乎我不知道什么时候在我的代码中使用这种函数,我总是依赖于从互联网上获得的源代码,谢谢你的回答btwya,但问题是我仍然在用php学习这些东西,我主要依赖于互联网上的源代码,关于SQL查询有什么建议吗?@dread:不幸的是,互联网上的许多代码都是垃圾。这对PHP来说尤其如此,但没有任何语言例外。关于避免SQL注入的建议,这个答案和其他关于上述问题的评论包含了非常有用的链接。我同意,我已经根据答案更改了代码,这些更改如上所述,但我仍在不断地获得false@dread:您的数据是否可能有重复的用户名,并且您没有看到正确的值?或者存储的哈希是以不同的方式创建的?还是在散列之前对其本身进行了修改
password\u verify
的功能完全相同,如果不匹配,则不匹配。先生,您所说的存储哈希是以不同的方式创建的,这是什么意思?在散列之前进行了修改?是的,但问题是我仍然在用php学习这些东西,我主要依赖于来自互联网的源代码,在SQL查询中有什么建议吗?@dread:不幸的是,互联网上的许多代码都是垃圾。这对PHP来说尤其如此,但没有任何语言例外。关于避免SQL注入的建议,这个答案和其他关于上述问题的评论包含了非常有用的链接。我同意,我已经根据答案更改了代码,这些更改如上所述,但我仍在不断地获得false@dread:您的数据是否可能有重复的用户名,并且您没有看到正确的值?或者存储的哈希是以不同的方式创建的?还是在散列之前对其本身进行了修改
password\u verify
的功能完全相同,如果不匹配,则不匹配。先生,您所说的存储哈希是以不同的方式创建的,这是什么意思?在散列之前修改过吗?