Php 密码验证numrows==0是否返回真实的未来问题?
我不熟悉php和sql编程,也不熟悉创建简单的登录,我在验证用户是否登录时遇到了问题。在过去的两天里,我已经在网络上进行了广泛的搜索,并对其进行了修复,但我不知道我的修复是否会在将来出现问题。这将是一个非常重要的程序,所以我真的很想在以后遇到问题之前知道 连接到数据库是可行的。报名表有效。电子邮件激活工作。使用下面的代码,登录似乎有效-它只允许登录数据库的电子邮件和密码,不匹配的密码/电子邮件不登录,使用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
$p\u hash=password\u hash($p,password\u DEFAULT)密码哈希的注册页面上的code>(据我所知,这是安全的)。然后使用下面的代码(以及一些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代码中发现了一个问题。Whereif($numrows>0)
在我将其更改为下面的代码之前-Whereif($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;
}}