-1

最近、登録ページでパスワードに暗号化を追加しました。

ページ抽出の登録:

$hashed_password = crypt('pass1'); 
mysqli_query($mysqli, "INSERT INTO Persons (Username, Password, Email, Gender) VALUES ('$euser', '$hashed_password', '$eemail', '$gender')");

私が見る限り、これは正常に機能し、すべてのデータがデータベースに正しく入力されています。

ただし、ログインページはフォームを検証しません。

ログインページの抽出

if( $page_mode == 'Login' )
{
    $username = $_POST['username'];
    $password = $_POST['password'];
    if( trim($username) == '' || trim($password) == '' )
    {
        $error_string .= '<font color=red>You have left either the username or password field blank!</font>';
    }
    else
    {
        require "globe.php";
        $result = mysqli_query("SELECT PlayerID, Username, Password FROM Persons WHERE Username='" . mysqli_real_escape_string($username) . "'");
        $has_pass = crypt($password, $row['Password']); 
        if( !($row = mysqli_fetch_assoc($result)) || ($row['Password'] != $has_pass) )
        {
            $error_string .= '<font color=red>Please check your username or password. Your details weren\'t correct.</font> ';
        }
        else 
        {
        $error_string .= '<font color=red>login not ready </font> ';
        mysqli_close($mysqli);
        }
    }
}

それはそれをチェックしていないようです。なぜかわからない?誰もが知っている

間違いなく機能するのは、ユーザー名とパスワードのフィールドが空白の場合のエラーメッセージだけです。

編集:

パスワードが「テスト」だったとしましょう。テストを入力すると、パスワードを認証するページ(ログインページも)がバックグラウンドのみで返されます。

他に何か入力しても同じ問題です。

編集:

すべてのサポートを追加しました。しかし、それでも運がありません

4

4 に答える 4

3

$has_pass = crypt('$password');

一重引用符内の変数を補間しようとしています。使うだけ

crypt($password);

于 2012-11-21T23:00:58.563 に答える
1

元のソルトを に提供する必要がありますcrypt

$has_pass = crypt($password, $row['password']); 

編集:データベースハンドルをに渡す必要がありますmysqli_query。何かのようなもの:

$result = mysqli_query($mysqli, "SELECT PlayerID, Username, Password FROM Persons WHERE Username='" . mysqli_real_escape_string($username) . "'");
于 2012-11-21T23:09:44.950 に答える
1

crypt()他の回答が指摘したように、バグに関する問題は別として、代わりに

$mysqli_query(...

書きます

mysqli_query(...

mysqli接続を条件付きで閉じることは言うまでもありませんが、常に閉じる必要があります。

編集

これを試して

if( $page_mode == 'Login' )
{
    $username = trim($_POST['username']);
    $password = trim($_POST['password']);

    if( ($username == '') || ($password == '') ) {
        $error_string .= '<font color=red>You have left either the username or password field blank!</font>';
    } else {
        require "globe.php";

        $query = sprintf("SELECT PlayerID, Username, Password FROM Persons WHERE Username='%s' LIMIT 1",
                                                mysqli_real_escape_string($mysqli, $username) );


        $result = mysqli_query( $query );

        if( ($result !== false) && (mysqli_num_rows($result) == 1) ) { 
          $row = mysqli_fetch_assoc($result);
          if( $row['Password'] != crypt($password, $row['Password']) ) {
              $error_string .= '<font color=red>Please check your username or password. Your details weren\'t correct.</font> ';
          } else {

              // OK

          }
        } else {
            $error_string .= '<font color=red>Please try again</font> ';
        }

        mysqli_close($mysqli);
    }
}

$resultクエリが成功したことを確認し、そのユーザーがパスワードのサルフを取得するためのエントリがあることを確認する必要がありますが$row、意図的に宿題として残しました:)

于 2012-11-21T23:05:38.403 に答える
0

mysqli_real_escape_string の最初のパラメーターとして mysqli ハンドルを追加してみて、行を取得することを確認してください - mysqli_real_esacpe_string($handle,$string)

于 2012-11-22T00:22:22.033 に答える