卡在密码更改代码中

时间:2017-01-29 06:29:20

标签: 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();       
    }   
 }  

3 个答案:

答案 0 :(得分:1)

您正在使用SQL查询所有用户检索所有数据库中的行

Statement s = c.createStatement();
ResultSet rs = s.executeQuery("SELECT * from tch_data");

当然,您的用户名和密码与所有行不匹配(因为您将在循环中看到数据库中的所有用户),因此您总是会收到每行的错误消息,除了对于那个有你的用户的那个。

您应该将查询更改为仅返回您要更改密码的用户的行。但是,这需要您使用PreparedStatement。 (如果你只是在查询中使用user_id而没有转义的常规Statement,你就会受到SQL注入攻击。请注意,这也适用于更新密码的地方 - 你也应该使用PreparedStatement,否则当有人将密码更改为'; DROP TABLE tch_data; SELECT * FROM tch_data 'foobar或其他某些内容时,你会遇到令人讨厌的惊喜。

所以你应该用这3行代替上面两行:

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

请注意,您还忘记关闭ResultSet,Statement和Connection。你应该关闭所有这些(但最重要的是Connection),否则你就会泄漏它们,你的应用程序很快就会耗尽资源。

答案 1 :(得分:0)

成功完成密码更改后,您应使用中断语句突破 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(); }   

答案 2 :(得分:0)

我完全同意Erwin Bolwidt的回答,这是恕我直言的正确答案。

既然你也问过为什么你最终得到了messagedialogues - >因为你正在加载所有用户!

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

   <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:padding="5dp"
    >

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">

        <ImageButton
            android:id="@+id/imgBtnItem"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:adjustViewBounds="true"
            android:scaleType="fitCenter"
            android:background="@android:color/transparent"
            android:src="@mipmap/ic_launcher">
        </ImageButton>

        <LinearLayout
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:weightSum="1">

            <TextView
                android:id="@+id/txtName"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:textStyle="bold"
                android:textSize="9sp"
                android:layout_below="@+id/imgBtnItem"
                android:text="Hello"
                android:layout_weight="0.7">
            </TextView>

            <ImageButton
                android:id="@+id/imgBtnAdd"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_below="@+id/imgBtnItem"
                android:layout_toRightOf="@+id/txtName"
                android:background="@android:color/transparent"
                android:src="@drawable/abc_btn_check_to_on_mtrl_015"
                android:layout_weight="0.3">
            </ImageButton>
        </LinearLayout>
    </LinearLayout>
</RelativeLayout>