2

より安全なログイン システムを作成しようとしています。私の登録は正常に機能しているため、接続の問題ではありません。私が見逃している可能性のあるエラーがあるかどうかを確認するために、新鮮な目が必要なだけです。誰か助けてください。ありがとう!

login.php

session_start();

if (isset($_POST['submit'])) 
    {

        $user = $_POST['username'];    
        $pass = $_POST['password'];


        if(!($stmt = $mysqli->prepare("SELECT username, password FROM users WHERE username = ?"))){
            echo "Prepare failed: (" . $mysqli->errno . ")" . $mysqli->error;
        }
        if(!$stmt->bind_param('s', $user)){
            echo "Bind failed: (" . $stmt->errno . ")" . $stmt->error;
        }
        if(!$stmt->execute()){
            echo "Execute failed: (" . $stmt->errno .")" . $stmt->error;
        }
        $userdata = $stmt->get_result();
        $row = $userdata->fetch_array(MYSQLI_ASSOC);

        $stmt->bind_result($user, $pass);
        $stmt->store_result();

        if(password_verify($pass, $row['password'])){

            $_SESSION['login_user'] = $_POST['username'];
            header('Location: profile.php');
            exit();
        }

    }
else{
    echo "Login Failed: (" . $stmt->errno .")" . $stmt->error;
}
$stmt->close();

$mysqli->close();

index.php(ログインフォーム)

<div id="loginform">

    Log in details<br /><br />

    <form method="post" action="login.php">

        Username:
        <input type="text" name="username" />
        <br /><br>
        Password:
        <input type="password" name="password" />
        <br /><br>
        <input type="submit" name="submit" value="Submit" />
    </form>

 </div>
4

1 に答える 1

3

エラー メッセージでは$stmt->errnoandを使用しないでください。その行はfor 句にあるため、MySQL エラーとは関係ありません。でログイン フォームを送信せずに にアクセスした場合にのみ発生するはずなので、なぜそのメッセージが表示されるのかわかりません。$stmt->errorLogin Failedelseif (isset($_POST['submit']))login.phpindex.php

$userdata->fetch_array()データベースから結果の行を取得するために使用しているため、 $stmt->bind_result()-- も使用しないでください。どちらか一方を実行してください。これらの変数に行を取得するためにbind_result()呼び出すことは決してないので、何もしていないと思います。$stmt->fetch()

を使用することにした場合は、フォームから送信されたパスワードが含まれているbind_result()ため、パスワードに別の変数を使用する必要があります。$pass

クエリによって行が返されたかどうかを確認する必要があります。ユーザーが無効なユーザー名を入力しても返されません。したがって、パスワードチェックは次のようになります。

if ($row && password_verify($pass, $row['password']) {
    ...
}

次にelse、ユーザー名またはパスワードが無効であることを報告する句が必要です。ユーザー名が間違っていたのかパスワードが間違っていたのかを区別するべきではありません。これはセキュリティにとって悪いことです (総当たり攻撃者がユーザー名を正しく推測したことを知るのに役立ち、別のパスワードを試す必要があるだけです)。

$stmt->close()ifブロック内にある必要があります。

于 2015-12-19T16:38:24.587 に答える