【问题标题】:How to verify username and password in Java-mysql?如何在 Java-mysql 中验证用户名和密码?
【发布时间】:2013-02-21 06:25:22
【问题描述】:

如何以最正确的方式验证用户输入数据库的用户名和密码?

In c++, we used to verify by using if-else:
    if((user == "username")&&(pass == "password")){
             cout<<"You are now logon!";
    }

在 java-mysql 中我不确定我是否走在正确的轨道上:

登录按钮

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:

        user = jTextField1.getText();
        pass = jPasswordField1.getPassword();
        login();
}

方法/功能

private void login() {

        try {
                if (user != null) {
                sql = "Select * from users_table Where username='" + user + "'";
                rs = stmt.executeQuery(sql);

                rs.next();
                username = rs.getString("username");
                password = rs.getString("password");

            }
        } 
    catch (SQLException err) {
            JOptionPane.showMessageDialog(this, err.getMessage());
        }

}

如果用户输入的用户名和密码与数据库中的匹配,那么他将被引导到一个新的jFrame else 将弹出消息对话框,提示用户名或密码无效。有人可以帮我写代码吗,我不知道如何在 mysql 中使用 if-else 语句;

谢谢! :)

【问题讨论】:

  • 您以明文形式保存密码?希望这不会被部署。
  • 您没有使用 PreparedStatement 来防范 SQL 注入...您以纯文本形式返回值...嗯,这是我看到的两个主要问题。我也看不到您实际上在哪里对密码的值进行任何比较。

标签: java passwords


【解决方案1】:

实现以下代码:

private void login() {
    try {
        if (user != null && pass != null) {
            String sql = "Select * from users_table Where username='" + user + "' and password='" + pass + "'";
            rs = stmt.executeQuery(sql);
            if (rs.next()) {
                //in this case enter when at least one result comes it means user is valid
            } else {
                //in this case enter when  result size is zero  it means user is invalid
            }
        }

        // You can also validate user by result size if its comes zero user is invalid else user is valid

    } catch (SQLException err) {
        JOptionPane.showMessageDialog(this, err.getMessage());
    }

}

【讨论】:

  • 这可行,但它很危险,因为它允许简单的 SQL 注入。您应该使用 PreparedStatement 而不是自己连接选择脚本。所以:connection.prepareStatement("select * from user_table where username = ? and password = ?"); p.setString(1, "Tom") ....
  • 这个解决方案展示了两个非常不好的做法:连接脏字符串允许 SQL 注入,并假设密码逐字存储在数据库中。事实上,它是有害的。
  • 除了 SQL 注入和纯文本密码的问题,在 java 中建议使用 char[] 而不是 String 作为密码
  • 用户名: admin 密码: ' OR password &lt;&gt; '
【解决方案2】:
  • 始终将 Hash 加密密码存储在数据库中,有关加密密码的更多详细信息,请参阅 JASYPT
  • 对用户输入的密码进行加密,比较两个加密后的密码
  • 查询数据库时使用parametrized queries

【讨论】:

  • 记住散列不是加密。您应该存储 散列 密码。 JASYPT 有正确的想法,即盐 + 迭代你的哈希。
【解决方案3】:

您不必再对 mySQL 做任何事情了。您已经拥有凭据。 一个例子:

if ((user.equals(username)) && (pass.equals(password))) {
   JFrame newFrame = new JFrame();
} else {
   JOptionPane.showMessageDialog(null, "alert", "alert", JOptionPane.ERROR_MESSAGE); 
}

【讨论】:

  • 用户和密码是用户输入的对吗?那么用户名和密码是结果集吗?用户名 = rs.getString("用户名");密码 = rs.getString("密码");正确的? @_@
  • 嗯...根据您的来源... user 和 pass 是数据库中的用户条目、密码和用户名...
  • 字符串应该与equals比较而不是==
【解决方案4】:

使用准备好的语句以及 DButils 之类的库可以大大简化您的工作。

另外,不要使用select name from members where code =?等替换传递参数。如果您有很多参数,请创建一个对象数组并将它们传递到一个对象数组中,例如Objects[] parms = {code1,code2}

【讨论】:

    【解决方案5】:
    if (username.length()>0 && password.length()>0)
    {
        String query = "Select * from adminlogin Where Username='" + username + "' and Password='" + password + "'";
    
        rs = sta.executeQuery(query);
    
       if (rs.next()) 
       {
    
            home hme=new home();
            this.setVisible(false);
            hme.setVisible(true);
       } 
       else 
       {
           JOptionPane.showMessageDialog(null,"username and password are wrong ");
       }
    }
    else
    {
          JOptionPane.showMessageDialog(null,"please field username and password ");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-04
      • 2021-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-13
      • 2021-07-29
      相关资源
      最近更新 更多