java - 被困在密码更改代码中

标签 java sql sql-injection

我制作此代码用于通过验证更改密码。问题是,当我单击 jbutton 更改密码时,它起作用并成功更改了数据库上的密码,并显示了 jOptionpane 信息消息。

但执行完此步骤后,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。 (如果您只是在常规 Statement 的查询中使用 user_id 而不进行转义,您就会遭受 SQL 注入(inject)攻击。请注意,这也适用于您更新密码的地方 - 您应该也为此使用PreparedStatement,否则当有人将密码更改为 '; DROP TABLE tch_data; SELECT * FROM tch_data 'foobar 或类似的内容时,您会感到非常惊讶)

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

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

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

关于java - 被困在密码更改代码中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41918271/

相关文章:

java - 重建 Eclipse 编辑器

java - 使用 equals 方法比较两个对象,Java

java - eclipse 插件 - 像处理 java 文件一样处理非 java 扩展文件

mysql - 在数据库中拆分表是否有助于解决性能问题?

sql - 如何处理这个SQL注入(inject)警告(CA2100)

c# - 如何参数化 SQL 表而不会受到 SQL 注入(inject)的影响

c# - 面向 C# 程序员的高级 Java 主题

c++ - 如何在 QCalendarWidget 中更改日期后保存条目?

mysql - 如何查询非重复行但保留主键

php - 如何处理 PHP 中 FluentPDO 的安全问题?