Java 被密码更改代码卡住了

Java 被密码更改代码卡住了,java,sql,sql-injection,Java,Sql,Sql Injection,我用这个代码来更改密码并进行验证。问题是,当我单击jbutton更改密码时,它工作并成功地更改了数据库上的密码,同时显示jOptionpane信息消息 但在此步骤之后,错误消息functionedjOptionpane将持续显示。我试着找出代码哪里错了。但是还不能 private void jBtn_UpdateActionPerformed(java.awt.event.ActionEvent evt) { String user_id = txt_UserID.getT

我用这个代码来更改密码并进行验证。问题是,当我单击
jbutton
更改密码时,它工作并成功地更改了数据库上的密码,同时显示
jOptionpane
信息消息

但在此步骤之后,错误消息functioned
jOptionpane
将持续显示。我试着找出代码哪里错了。但是还不能

 private void jBtn_UpdateActionPerformed(java.awt.event.ActionEvent evt) { 

        String user_id = txt_UserID.getText();
        String cur_pass = txt_CurrentPassword.getText();
        String new_pass = txt_NewPassword.getText();

    try {
            Connection c = DBConnection.dbconmethod();
            Statement s = c.createStatement();
            ResultSet rs = s.executeQuery("SELECT * from tch_data");

       while(rs.next()) {
                  String userid = rs.getString("user_id");
                  String pass = rs.getString("password");

            if(user_id.equals(userid) && cur_pass.equals(pass)) {

                  Statement s1 = c.createStatement();
                  s1.executeUpdate("UPDATE tch_data SET password='"+new_pass+"' WHERE user_id='"+user_id+"'");
                  JOptionPane.showMessageDialog(new view.AdminPrivacy(), "Password Succesfully Changed!", null, JOptionPane.INFORMATION_MESSAGE);

            }else {

                  JOptionPane.showMessageDialog(new view.AdminPrivacy(), "Error : Invalid Data.", "Error Message", JOptionPane.ERROR_MESSAGE);

            }   
        }

    } catch (Exception e) {
       e.printStackTrace();       
    }   
 }  
您正在使用SQL查询为所有用户检索数据库中的所有行

Statement s = c.createStatement();
ResultSet rs = s.executeQuery("SELECT * from tch_data");
当然,您的用户名和密码与所有行都不匹配(因为您将在循环中看到数据库中的所有用户),因此除了包含您的用户的行之外,您总是会收到每一行的错误消息

您应该将查询更改为仅返回要为其更改密码的用户的行。但是,这需要您使用一个PreparedStatement。(如果您只是在查询常规
语句时使用user_id而不转义,则会使自己受到SQL注入攻击。请注意,这也适用于您更新密码的位置-您还应使用PreparedStatement,否则,当有人更改密码时,您会感到非常意外。)d到
”;删除表tch_数据;从tch_数据“foobar
中选择*或沿着这些行的内容)

因此,您应该将上述两行替换为以下三行:

PreparedStatement st = c.prepareStatement("SELECT * from tch_data WHERE user_id = ?");
st.setString(1, user_id);
ResultSet rs = st.executeQuery();

请注意,您还忘记关闭结果集、语句和连接。您应该关闭所有密码(但最重要的是连接),否则您正在泄漏密码,您的应用程序将很快耗尽资源。

一旦成功更改密码,您应该使用break语句中断while循环。while循环中的else语句也应删除并放置在循环之外。应设置布尔标志,以确定是否已成功更改密码,并在循环外部检查该条件,例如:

try {
    Connection c = DBConnection.dbconmethod();
    Statement s = c.createStatement();
    ResultSet rs = s.executeQuery("SELECT * from tch_data");
    boolean success = false;    // **** Added Code ****

    while(rs.next() && success == false) {
          String userid = rs.getString("user_id");
          String pass = rs.getString("password");

          if(user_id.equals(userid) && cur_pass.equals(pass)) {
              Statement s1 = c.createStatement();
              s1.executeUpdate("UPDATE tch_data SET password='"+new_pass+"' WHERE user_id='"+user_id+"'");
              success = true;   // **** Added Code ****
              JOptionPane.showMessageDialog(new view.AdminPrivacy(), "Password Succesfully Changed!", null, JOptionPane.INFORMATION_MESSAGE);
              break;  // **** Added Code ****
         }
     }
     // **** Added Code ****
     if (!success) {
         JOptionPane.showMessageDialog(new view.AdminPrivacy(), "Error : Invalid Data.", "Error Message", JOptionPane.ERROR_MESSAGE);
     }   
} catch (Exception e) { e.printStackTrace(); }   

我完全同意埃尔文·博维特的答案,这是正确的答案

因为您还问到,为什么会以MessageDialogs-->结束,因为您正在加载所有用户

你的if-else块是错误的。如果您只更改/检查一个用户的密码

// make sure that it's the correct user 
if(user_id.equals(userid)) {
    // check if password was changed successfully
    if(cur_pass.equals(pass)) {
        // successful password change
    } else {
        // something went wrong with the password change
    }
} else {
    // this else is just to help you see your mistake
    // in your code you raised the error here!
}

太多了@Erwin Bolwidt我完全明白了。。。再次感谢!是的。。我已经投票了。但它没有显示并显示此消息!这仍然会读取tch_数据表中的所有行,因此随着更多用户添加到数据库中,这段代码将变得非常慢。我是否遗漏了问题中的某些内容?