有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java此登录代码易受SQL注入攻击吗?

String sSQL = "select RFC,Contraseña from Administradores where RFC='" + txtUsuario.getText() + "' and Contraseña='" + txtContrasena.getText() + "'";

String[] registros = new String[2];
Try  {
    conect();
    conexion = DriverManager.getConnection("jdbc:sqlite:" + base);
    Statement stat = conexion.createStatement();
    ResultSet rs = stat.executeQuery(sSQL);
    while (rs.next()) {
        registros[0] = rs.getString("RFC");
        registros[1] = rs.getString("Contraseña");
    }
    stat.close();
    conexion.close();
} catch (SQLException ex)    
{    
    JOptionPane.showMessageDialog(null,"DB connection error");    
}
if ((txtContrasena.getText().equals(registros[1])) || (txtUsuario.getText().equals(registros[0]))) {
    JOptionPane.showMessageDialog(null, "Access Granted");
    Escoger variable = new Escoger();
    variable.setVisible(true);
    dispose();
} else {
    if (txtContrasena.getText() != (registros[1])) {
        JOptionPane.showMessageDialog(null, "Incorrect password");
    }
}

共 (3) 个答案

  1. # 1 楼答案

    此外,永远不要在数据库中存储密码。您应该在数据库中存储密码的散列版本,要检查密码,您需要对给定的密码进行散列(安全地,如果通过web,则为https),并将该散列值与数据库中的散列值进行比较。使用安全哈希算法(例如,不是MD5)。更好的方法是,将用户名和密码连接起来并对其进行散列,然后将其作为值存储在数据库中并进行比较(这样,具有相同密码的两个用户就不会对相同的值进行散列)

  2. # 2 楼答案

    这个

    String sSQL = "select RFC,Contraseña from Administradores where RFC='" + 
                  txtUsuario.getText() + "' and Contraseña='" + 
                  txtContrasena.getText() + "'";
    

    会自动暗示是的。输入到txtUsuariotxtContrasena的任何内容都可能包含有效的SQL代码,可以由数据库的SQL引擎执行

    您应该使用:

    String sSQL = "select RFC,Contraseña from Administradores where RFC=? and Contraseña=?";
    

    然后你需要改变

    Statement stat = conexion.createStatement();
    

    PreparedStatement stat = conexion.preapreStatement(sSQL);
    stat.bindString(1, txtUsuario.getText());
    stat.bindString(2, txtContrasena.getText());
    

    有关更多详细信息,请查看Using Prepared Statements

  3. # 3 楼答案

    对。改用PreparedStatements。用占位符替换用户和密码值

    String SampleQuery = "SELECT * FROM YourTable WHERE User = ? AND Password = ?";
    String UserName = UsernameBox.getText();
    String Password = PasswordBox.getText();
    
    PreparedStatement prep = conn.prepareStatement(SampleQuery);
    prep.setString(1, UserName);
    prep.setString(2, Password);
    ResultSet result = prep.executeQuery();