-2

我无法让我的程序正常运行。我能够清除任何语法错误,但现在我已经发布了我的输出。我有以下声明并且 ELSE IF 似乎不起作用?它总是忽略 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);
    }
}                                         
4

3 回答 3

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
}

但是将密码存储在数据库中是一个主要的安全漏洞,因此整个方法并不安全。典型的做法是使用存储密码以防止使用彩虹表。为了验证密码,可以使用相同的哈希算法和盐来与数据库中存储的内容进行比较,

于 2013-06-25T16:05:28.787 回答
0

首先,这会受到 SQL 注入攻击。了解prepared statements,并使用prepared statements的参数传递功能,防止用户名像:Little Bobby Tables

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

如果你要我给你一个红苹果的水果,那么假设我是信任的,当我给你一个红苹果的时候,检查一下这个苹果是不是苹果,或者那个红不是红的导致检查一个从未满足的条件。

于 2013-06-25T16:21:41.063 回答
0

如果用户名被强制唯一,您可以从查询中取出密码的匹配条件。然后只需查询用户名匹配条件并获取该行的用户名和密码。这样,您可以更轻松地检查不正确的密码或不正确的用户名。现在的查询方式只会在用户名和密码正确且您永远不会输入 else if 时返回结果。

于 2013-06-25T16:21:44.020 回答