Mysqli, sha1/salt 密码有效检查


mysqli, sha1/salt password valid check

所以我正在创建一个登录表单。验证用户输入以检查电子邮件格式是否正确以及密码是否超过 6 个字符,如果这些有效,则检查登录是否凭据有效,并且与存储在用户表上的电子邮件/密码匹配。在注册表中,我使用 sha1 和给定的盐加密密码。当我检查是否密码正确,我写了相同的检查,但即使我输入了正确的登录名凭据似乎无法验证登录。所以这是我的代码:用户登录功能:

function user_login($email, $password){
    global $db;
    $salt='%#@#@**#_-!';
    $userid = id_from_email($email);
    $email = sanitize($email);
    $password  = sha1($password.$salt);
    $query="SELECT UserId FROM users WHERE Email= '".$email."' and UserPass= '".$password."' ";
    $result=$db->query($query);
    $valid = $result->num_rows;
    return ($valid >1) ? $userid : false;
}

这是登录的部分.php用于检查登录是否有效:

else if(empty($errors) == true) {
        $userlogin=user_login($email, $password);
        if ($userlogin==false){
        $errors[]='Wrong email/password combination.';
        } else {
        //set the user session
        session_start();
        $_SESSION['UserId']=$userlogin;
        header('Location:success.php');
        }

无论我是否输入了正确的密码和电子邮件。它总是输出"错误的电子邮件/通行证组合"以下是我将通行证存储在寄存器数据库中的方式.php

$salt='%#@#@**#_-!';
$password = sha1($password.$salt);

如果您能帮助我,我将不胜感激。

谢谢。

你真正想要的是:

return ($valid >= 1) ? $userid : false;

而不是

return ($valid > 1) ? $userid : false;

除非您希望至少有 2 行应与给定的电子邮件和密码哈希匹配。

我更喜欢这个:

return ($valid == 1) ? $userid : false;

使用适当的电子邮件变量修改对数据库的调用:

$query="SELECT UserId FROM users WHERE Email= '".$useremail."' and UserPass= '".$password."' ";

您正在从数据库中选择UserId,但从未实际使用该结果;您的user_login()函数返回id_from_email($email)的结果,而不是从数据库接收的 ID。检查您的id_from_email()返回值,或者更好的是 - 从数据库查询返回 ID。