Java 查询返回(rs.next()==false)。已填充表,已连接数据库
我正在尝试为连接到MYSQL的图书馆管理系统编写一个登录和连接函数。当我试图从数据库中检索personnummer和password时,它返回rs.Next==false。该表已填充,查询将返回数据库连接。谁能帮我找出我做错了什么?谢谢Java 查询返回(rs.next()==false)。已填充表,已连接数据库,java,mysql,database-connection,Java,Mysql,Database Connection,我正在尝试为连接到MYSQL的图书馆管理系统编写一个登录和连接函数。当我试图从数据库中检索personnummer和password时,它返回rs.Next==false。该表已填充,查询将返回数据库连接。谁能帮我找出我做错了什么?谢谢 public class main { public static void login() { //UI layer has been removed loginBu
public class main {
public static void login() {
//UI layer has been removed
loginButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
String personnummer = F_personnummer.getText();
char[] password = F_password.getPassword();
if(personnummer.equals("")){
JOptionPane.showMessageDialog(null,"Please enter personnummer (YYMMDDXXXX)");
} else if (password.equals("")){
JOptionPane.showMessageDialog(null,"Please enter password");
} else {
try {
Connection connection=connect();
Statement stmt = connection.createStatement();
stmt.executeUpdate("USE library");
PreparedStatement loginQuery = connection.prepareStatement("SELECT * FROM library.users WHERE personnummer = " + "'" + personnummer + "'" + " AND password ='" + password + "'", ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet rs = loginQuery.executeQuery();
if(rs.next()==false) {
JOptionPane.showMessageDialog(null,
} else {
jframe.dispose();
rs.beforeFirst();
while(rs.next()) {
if(personnummer.equals("admin") & password.equals("admin")) {
adminMenu();
} else {
userMenu(personnummer);
}
} // end while ()
} // end else ()
} // end try ()
catch (Exception exception) {
exception.printStackTrace();
}
}
}
});
// UI layer has been removed
}
public static Connection connect() throws Exception{
try{
String driver = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/library?useTimezone=true&serverTimezone=UTC";
String username = "root";
String password = "root";
Class.forName(driver);
Connection connection = DriverManager.getConnection(url,username,password);
System.out.println("Connected to database");
return connection;
}
catch (Exception exception) {
System.out.println(exception);
}
return null;
}
不安全代码
此代码是一个安全漏洞;例如,我可以输入这个作为密码:whatever';DROP TABLE library.users;--在登录表单上的密码框中输入密码后,数据库表将冒烟。解决的办法是使用准备好的报表;SQL查询必须始终是单个长字符串常量,不能将用户输入混入其中。您已经在其中准备好了语句-只需将所有字符串替换为问号:
PreparedStatement loginQuery = connection.prepareStatement("SELECT * FROM library.users WHERE personnummer = ? AND password = ?", ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
loginQuery.setString(1, personnummer);
loginQuery.setString(2, password);
不安全代码-重发
您应该使用bcrypt、scrypt、pbkdf2或其他一些密码哈希算法;这对你的用户来说是不安全的。你的笔记本电脑上有一个db的克隆,最后在街上,现在你所有用户的密码都在街上。用户倾向于重复使用密码。一般来说,整个行业,特别是像GDPR这样的各种法律,都把责任完全推到了你的脚上。包括巨额罚款。不要违反行业标准-使用密码哈希器
你真正的错误
您正在将“password”变量合并为字符串。这将调用变量上的toString。这个变量是一个char数组,它不像您想象的那样字符串化。您的查询结果为:选择*无论密码在哪里[C@1234567-试试看,打印那个字符串
结合修复
ps.setString2,新的Stringpassword。你应该发布一个。如果你确定你的问题是关于JDBC的,请隔离代码的这一部分,删除UI层。我不确定问题是什么,我是一个完全的初学者,所以我不确定你们需要看到多少。直接将任何用户输入输入到SQL中通常是不好的做法语句。使用SQL注入可能会滥用它。请使用如图所示的setString方法