我是php和sql编程的新手,并且创建了一个简单的登录,我在验证用户登录方面遇到了问题。过去2天我已经广泛搜索了网页并修复了它,但我不知道#39;我知道我的修复程序将来会以某种方式出现问题。这将是一个非常重要的计划,所以我在以后遇到问题之前真的很想知道。
连接数据库有效。注册表单有效。电子邮件激活有效使用下面的代码,登录似乎有效 - 它只允许在数据库中记录的电子邮件和密码以及不匹配的密码/电子邮件,使用$p_hash = password_hash($p, PASSWORD_DEFAULT);
登录密码哈希的注册页面(根据我的理解,这是安全的)。然后使用下面的代码(以及一些javascript / ajax验证)来验证密码和电子邮件地址。使用$p = $_POST['p'];
和!password_verify($p, $db_pass_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代码中发现问题。在我将if($numrows > 0)
更改为以下代码之前的位置 - if($numrows == 0)
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;
}}
因此,出于某种原因,它显示数据库中的行数等于0,这是不正确的。这似乎是因为密码哈希,因为这是我首先发现这个问题的方式,当我拿出AND password='$p'
并使用if($numrows > 0)
运行代码时,它就可以了。
此修改(if($numrows == 0)
)使登录验证工作正常,但我不希望它在将来出现问题。
任何帮助/意见/建议将不胜感激!