Java和MySQL - 创建登录认证

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----");
    }

3
请使用 PreparedStatement 来避免 SQL 注入攻击。另外,有哪些事情没有正常工作? - Sotirios Delimanolis
2
  1. 不要存储明文密码,应该进行哈希处理。
  2. 如果你得到了任何记录,那么用户名和密码匹配,因此不需要进一步检查(你不需要从数据库中获取值并在Java中进行匹配)。
- SJuan76
更大的问题是,如果在提示输入用户名时,您将用户名和密码“ABC def”一起输入为一行,则会成功登录。而我希望它分成两步。因此,“ABC def”不是正确的用户名,“ABC”才是。 - Jonathon Charles Loch
在MySQL查询中,您可能想使用AND而不是&& - Philip Whitehouse
1个回答

3
如果ResultSet返回一行,说明用户名和密码已经被SQL语句检查过了,你不需要再次检查。此外,你应该建立一个系统,确保同一个用户名不能被多次使用(在数据库中将其设为Unique或将其作为关键字)。同时,使用预编译语句和哈希密码来避免注入和其他攻击。

我仍在学习MySQL/Java,你能推荐一个关于哈希密码信息的网站吗?谢谢!而且不进行双重检查也是有道理的,谢谢! - Jonathon Charles Loch
请查看https://dev59.com/73RC5IYBdhLWcg3wFM_X以了解如何使用md5哈希。如果您有更多问题,请给我发消息。 - PRNDL Development Studios

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接