我无法让我的程序正常运行。我能够清除任何语法错误,但现在我已经发出了我的输出。
我有以下声明,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);
}
}
答案 0 :(得分:3)
查询返回匹配的user
和pass
值,因此没有!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)
如果用户名被强制为唯一,则可以从查询中获取密码的匹配条件。然后只查询用户名匹配条件并获取该行的用户名和密码。这样您就可以更轻松地检查错误的密码或错误的用户名。现在的查询方式只会在用户名和密码正确的情况下返回结果,如果是,则永远不会输入你的其他内容。