5

JavaアプリをMySQLに正常に接続しました。次に、ユーザーにユーザー名とパスワードを入力してもらいます。次に、MySQLにクエリを送信し、そのユーザー名のスポットを探してから、指定されたパスワードをデータベース内のパスワードと比較します。そして、ほとんどの場合、これは機能します。ユーザー名が「ABC」で、パスワードが「def」であるとします。ユーザー名の入力を求められ、「ABC def」と入力すると、「def a」のパスワードと同じように、成功したと表示されます。問題はrs.next()であり、スペースの前のテキストのみをチェックしていると思います。

ソリューションのアイデアはありますか?

    String databaseUsername = "";
    String databasePassword = "";

    // Check Username and Password
    System.out.print("Enter Username: ");
    String name = sc.next();
    System.out.print("Enter Password: ");
    String password = sc.next();

            // Create SQL Query
    Statement stmt = connection.createStatement();
    String SQL = "SELECT * FROM users WHERE users_name='" + name + "' && users_password='" + password+ "'";

    ResultSet rs = stmt.executeQuery(SQL);

            // Check Username and Password
    while (rs.next()) {
        databaseUsername = rs.getString("users_name");
        databasePassword = rs.getString("users_password");
    }

    if (name.equals(databaseUsername) && password.equals(databasePassword)) {
        System.out.println("Successful Login!\n----");
    } else {
        System.out.println("Incorrect Password\n----");
    }
4

1 に答える 1

3

が行を返す場合、ユーザー名とパスワードはステートメントResultSetによってすでにチェックされています。SQL再度確認する必要はありません。また、同じユーザー名を複数回使用できないシステムを導入する必要があります。(Uniqueデータベースで作成またはキー入力)

また、プリペアドステートメントとハッシュ化されたパスワードを使用して、インジェクションやその他の攻撃を回避します。

于 2013-03-01T19:10:19.653 に答える