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
信息消息
但在此步骤之后,错误消息functionedjOptionpane
将持续显示。我试着找出代码哪里错了。但是还不能
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_数据表中的所有行,因此随着更多用户添加到数据库中,这段代码将变得非常慢。我是否遗漏了问题中的某些内容?