如果声明有效,否则无效。为什么?

时间:2013-06-25 16:01:42

标签: java

我无法让我的程序正常运行。我能够清除任何语法错误,但现在我已经发出了我的输出。 我有以下声明,ELSE IF似乎没有工作?如果代码,它总是忽略其他。我无法理解代码的问题。

有谁能够帮我?

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

    Connection con;
    PreparedStatement stmt;
    ResultSet rs;

    try {       

         //connect to the database
        String host = "jdbc:derby://localhost:1537/LoginSystem";
        String uName = "root";
        String uPass = "root";
        con = DriverManager.getConnection(host, uName, uPass);

        String user = username_txt.getText();
        String pass = passwordField_txt.getText();

        String sql = "Select USERNAME,PASSWORD from LOGINSYSTEM where USERNAME = '"+user+"' AND PASSWORD = '"+pass+"'";
        stmt = con.prepareStatement(sql);        

        rs = stmt.executeQuery();

        while(rs.next()) {

            String s1 = rs.getString(1);
            String s2 = rs.getString(2);

            if(user.equals(s1) && pass.equals(s2)) {

                JOptionPane.showMessageDialog(null, "Login Successfull!");
                Account obj = new Account();
                obj.setVisible(true);

            } else if(!user.equals(s1) && !pass.equals(s2)) {

                JOptionPane.showMessageDialog(null, "Login Failed!");

            } else if(!pass.equals(s2)) {
                JOptionPane.showMessageDialog(null, "Please Enter A Valid Password.");
                passwordField_txt.setText(null);
            }
        }

    } catch(SQLException e) {
        JOptionPane.showMessageDialog(null, e);
    }
}                                         

3 个答案:

答案 0 :(得分:3)

查询返回匹配的userpass值,因此没有!user.equals(s1) && !pass.equals(s2)满足的条件。始终使用PreparedStatement占位符而不是String串联来防止SQL注入。

区分无效用户名和密码之间的错误,可以让任何潜在的黑客深入了解可以使用哪些信息来访问系统。

如果代码看起来像什么

if (rs.next()) {

   String s1 = rs.getString(1);
   String s2 = rs.getString(2);

   // user and pass already match from SQL - no if logic necessary

} else {
     // display GENERIC login failure message
}

但是将密码存储在数据库中是一个主要的安全漏洞,因此整个方法不安全。典型的方法是使用salt存储密码以防止使用rainbow tables。要验证密码,可以使用相同的散列算法和salt来与数据库中存储的内容进行比较,

答案 1 :(得分:0)

首先,这会受到SQL注入攻击。了解预准备语句,并使用预准备语句的参数传递功能,以防止用户名如:Little Bobby Tables

其次,您的where语句将返回用户名和密码与输入值完全匹配的行。因此,比较非空结果将保证始终匹配,除非出现一些令人难以置信的奇怪的数据库错误。

如果你让我给你一个水果是红苹果的水果,那么假设我是可信的,当我给你一个红苹果,检查苹果是不是苹果,或者红色是不是红色将导致检查从未满足的条件。

答案 2 :(得分:0)

如果用户名被强制为唯一,则可以从查询中获取密码的匹配条件。然后只查询用户名匹配条件并获取该行的用户名和密码。这样您就可以更轻松地检查错误的密码或错误的用户名。现在的查询方式只会在用户名和密码正确的情况下返回结果,如果是,则永远不会输入你的其他内容。