登录PHP脚本用户名和密码是正确的,但不会登录

时间:2012-11-06 11:37:05

标签: php login

我必须使用我的PHP登录脚本修复一些错误,当用户创建一个带有大写字母的帐户时,它不会让他以全小写字母登录,所以我决定修复它,但是,它赢了登录时,它只是重定向到登录,并显示“发生意外错误”。

它通过用户名检查,但不是密码,并且它不返回密码不正确。

我尝试创建一个新帐户,它仍然会转到该错误页面,但这一次,它实际上已经登录了我,但没有使用您已成功登录,并且现有用户无法登录,但是我制作的新作品。

我确实尝试过密码重置,但是没有导致成功登录消息。

我做的另一个更改是密码哈希,因为我使用用户名密码盐,我从$hash = hash('sha256',$Username.$Password.$Salt);更改为$hash = hash('sha256',strtolower($Username).$Password.$Salt);因为,当用户名是大写或小写时,它有效果在密码检查上。

我的代码:

<?php
    /* Mysql data */
    $MysqlUsername = "root";
    $MysqlPassword = "*********";
    $MysqlHostname = "localhost";
    $MysqlDatabase = "teamgamersnet";
    $Salt = "******";
    $Username = $_POST['Username'];
    $Password = $_POST['Password'];
    $Remember = $_POST['Remember'];
    $Cookie = "TGN";
    $IP       = $_SERVER['REMOTE_ADDR'];
    if (empty($Username) || empty($Password)) { die("Please fill in all the fields"); }


    $hash = hash('sha256',strtolower($Username).$Password.$Salt);

    $Sql = new mysqli($MysqlHostname, $MysqlUsername, $MysqlPassword, $MysqlDatabase);
    if ($Sql->connect_error){ echo $Sql->connect_error; }
    $sUser = $Sql->real_escape_string($Username);
    $sPass = $Sql->real_escape_string($Password);
    $xPass = $Sql->real_escape_string($hash);


    $CheckUser = $Sql->query("SELECT Username FROM `users` WHERE `Username` = '".$sUser."'");
    $CheckPass = $Sql->query("SELECT Password FROM `users` WHERE `Username` = '".$sUser."'");
    $CheckActive = $Sql->query("SELECT Activated FROM `users` WHERE `Username` = '".$sUser."'");
    if ($CheckUser->num_rows == 0) { header("Location: /?p=Login&wrongusr=true"); die(); }
    $xCheckUser = $CheckUser->fetch_array(MYSQLI_ASSOC);
    $xCheckPass = $CheckPass->fetch_array(MYSQLI_ASSOC);
    $xCheckAct =  $CheckActive->fetch_array(MYSQLI_ASSOC);
    if ($xCheckAct['Activated'] == "false") { header("Location: /?p=Login&activate=true"); die(); }
    if(strtolower($Username) == strtolower($xCheckUser['Username'])) { // Check if username match
        if($hash == $xCheckPass['Password']) { // Check if password is correct
        if(isset($Remember)){
                setcookie ($Cookie."User", htmlspecialchars($Username));
                setcookie ($Cookie."Pass", $hash);
        }
        else
        {
                setcookie ($Cookie."User", htmlspecialchars($Username), time() + 3600);
                setcookie ($Cookie."Pass", $hash, time() + 3600);
        }
                header("Location: /?login=true"); // Send them to home page 
    }

    else
    {
        header("Location: /?p=Login&wrongpwd=true"); // Send them to home page 
    }
    header("Location: /?p=Login&unxer=true"); // Username error, Idk why
    }
?>

1 个答案:

答案 0 :(得分:3)

默认字符集和排序规则为latin1latin1_swedish_ci,因此非二进制字符串比较默认情况下不区分大小写。这意味着,如果您使用col_name LIKE 'a%'进行搜索,则会获得以Aa开头的所有列值。

要使此搜索区分大小写,请确保其中一个操作数具有区分大小写或二进制排序规则。例如,如果要比较具有latin1字符集的列和字符串,则可以使用COLLATE运算符使任一操作数具有latin1_general_cs或{{1整理。

您只需要使用latin1_binUsername更改Passwordlatin1_general_cs字段'排序规则,然后它就会相应地运作。