1

ログイン スクリプトでブルート フォース保護を作成しようとしています。アカウントがロックされているデータベースを更新するはずのクエリは機能しませんが。このコードを 30 分間見てきたので、イライラし始めています..

とにかくここにコードがあります:

if(isset($_POST['submit'])) {
$mysqli = getConnected('*','*','*','*');
$username = $mysqli->escape_string($_POST['username']);
$password = $mysqli->escape_string($_POST['password']);
$hash = sha1($password);
$query = "SELECT * FROM users WHERE username='$username'";
$result = $mysqli->query($query);
$data = $result->fetch_assoc();

    if($data['lock'] == 0) {
        if($hash == $data['password']) {
        $_SESSION['loggedin'] = true;
        $_SESSION['username'] = $username;
        $result->free();
        $mysqli->close();
        header("Location: index.php?p=start");
        } else {
            if($data['login_attempts'] != 0) {
                $attempts_left = $data['login_attempts'] - 1;
                $query2 = "UPDATE users SET login_attempts='$attempts_left' WHERE username='$username'";
                $mysqli->query($query2);
                echo "Inloggningen misslyckades, du har ". $attempts_left ." försök kvar.";
            } else {
                $query3 = "UPDATE users SET lock='1' WHERE username='$username'";
                $mysqli->query($query3);
                echo "Ditt konto har låsts.";
            }
        }
    } else {
        echo "Ditt konto är låst, kontakta webmaster för att återställa det.";
    }
}

問題は $query3 が実行される場所ですが、var_dump に従って正しく実行されます。

私が狂っていないことを確認するために、2番目の目が必要です!

4

1 に答える 1

1

問題は、それlockmysql の予約語であることです。クエリを次のように変更する必要があります。

$query3 = "UPDATE users SET `lock`='1' WHERE username='$username'";
                            ^^^^^^ use back-ticks to escape reserved words in mysql
于 2013-03-06T18:11:22.637 に答える