1

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
    }
?>
4

1 に答える 1

3

デフォルトの文字セットと照合順序はlatin1andlatin1_swedish_ciであるため、非バイナリ文字列の比較ではデフォルトで大文字と小文字が区別されません。つまり、 で検索すると、またはcol_name LIKE 'a%'で始まるすべての列の値が取得されます。Aa

この検索で​​大文字と小文字を区別するには、オペランドの 1 つに大文字と小文字を区別する照合またはバイナリ照合があることを確認してください。たとえば、どちらもlatin1文字セットを持つ列と文字列を比較する場合、COLLATE演算子を使用して、いずれかのオペランドにlatin1_general_csorlatin1_bin照合を持たせることができます。

UsernamePasswordフィールドの照合をlatin1_general_csorで変更するだけlatin1_binで、それに応じて機能します。

于 2012-11-06T13:02:03.527 に答える