Php 密码验证numrows==0是否返回真实的未来问题?

Php 密码验证numrows==0是否返回真实的未来问题?,php,mysql,validation,login,passwords,Php,Mysql,Validation,Login,Passwords,我不熟悉php和sql编程,也不熟悉创建简单的登录,我在验证用户是否登录时遇到了问题。在过去的两天里,我已经在网络上进行了广泛的搜索,并对其进行了修复,但我不知道我的修复是否会在将来出现问题。这将是一个非常重要的程序,所以我真的很想在以后遇到问题之前知道 连接到数据库是可行的。报名表有效。电子邮件激活工作。使用下面的代码,登录似乎有效-它只允许登录数据库的电子邮件和密码,不匹配的密码/电子邮件不登录,使用$p\u hash=password\u hash($p,password\u DEFAUL

我不熟悉php和sql编程,也不熟悉创建简单的登录,我在验证用户是否登录时遇到了问题。在过去的两天里,我已经在网络上进行了广泛的搜索,并对其进行了修复,但我不知道我的修复是否会在将来出现问题。这将是一个非常重要的程序,所以我真的很想在以后遇到问题之前知道

连接到数据库是可行的。报名表有效。电子邮件激活工作。使用下面的代码,登录似乎有效-它只允许登录数据库的电子邮件和密码,不匹配的密码/电子邮件不登录,使用
$p\u hash=password\u hash($p,password\u DEFAULT)(据我所知,这是安全的)。然后使用下面的代码(以及一些javascript/ajax验证)用电子邮件地址验证密码。使用
$p=$\u POST['p']
!密码验证($p,$db\u pass\u str)

我之所以提到这一点,是因为它似乎助长了这里的问题

$p = $_POST['p'];

// GET USER IP ADDRESS
$ip = preg_replace('#[^0-9.]#', '', getenv('REMOTE_ADDR'));
// FORM DATA ERROR HANDLING
if($e == "" || $p == ""){
    echo "login_failed";
    exit();
} else {
// END FORM DATA ERROR HANDLING
    $sql = "SELECT id, username, password FROM users WHERE email='$e' AND activated='1' LIMIT 1";
    $query = mysqli_query($db_conx, $sql);
    $row = mysqli_fetch_row($query);
    $db_id = $row[0];
    $db_username = $row[1];
    $db_pass_str = $row[2];
    if(!password_verify($p, $db_pass_str)){
        echo "login_failed";
        exit();
    } else {
        // CREATE THEIR SESSIONS AND COOKIES
        exit();
    }
}
exit();
上面的代码包括check_login_status.php,因此这导致我在一些check_login_status.php代码中发现了一个问题。Where
if($numrows>0)
在我将其更改为下面的代码之前-Where
if($numrows==0)

因此,出于某种原因,它显示数据库中的行数等于0,这不是真的。这似乎是因为密码散列,因为这是我第一次发现这个问题的原因,当我取出
和password='$p'
并使用
if($numrows>0)
运行代码时,它就工作了

此修改(
if($numrows==0)
)使登录验证工作正常,但我不希望将来出现问题


如有任何帮助/意见/建议,将不胜感激

evalLoggedUser()
函数中,传递明文密码并在查询中使用它;但是数据库中存储的密码哈希值与明文密码不匹配,因此它将永远找不到任何匹配的记录。如果您需要在此函数中进行密码检查,然后从查询中删除密码检查,测试返回的1行,获取该行,并使用password_verify()验证密码正如您在登录检查中所做的,谢谢@MarkBaker。我以前考虑过,但如果是这样,为什么我可以在登录页面上使用纯文本密码登录?据我所知,
$p=$\u POST['p']
应从表单中的密码id中提取数据。然后
$db\u pass\u str=$row[2]从数据库获取密码(第3列)。然后
if(!password\u verify($p,$db\u pass\u str))
表示if form pw!=然后登录失败。是吗?@MarkBaker我仍在考虑并将尝试你在第二次评论中所说的话。再次感谢。我一直在努力按照@MarkBaker所说的去做,但我还是没有得到多少。我知道,当我取出
和password='$p'
时,它会找到我想要的行,但我相当确定
password
是来自DB的哈希密码,因为它在DB中是哈希的。我认为
password\u verify($p,$db\u pass\u str)
应该解释散列的pw,并确保它与
$p
相同。其中
$p=$\u POST['p']
function evalLoggedUser($db_conx,$id,$u,$p){
$sql = "SELECT ip FROM users WHERE id='$id' AND username='$u' AND password='$p' AND activated='1' LIMIT 1"; 
$query = mysqli_query($db_conx, $sql);
$numrows = mysqli_num_rows($query);
if($numrows == 0){ ////////THIS COULD BE PROBLEMATIC?, WORKS FOR NOW!!!!!!!
    return true;
}}