2014-01-31 105 views
-2
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"); 
    } 
} 
+1

爲什麼你認爲它不是? – SLaks

+2

如果你沒有使用準備好的陳述,答案是肯定的。 – chrylis

回答

3

這...

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

此外,你不應該在數據庫中存儲密碼。您應該在數據庫中存儲散列版本的密碼,並檢查密碼,以散列您給出的密碼(安全地,通過網絡https),並將該散列值與數據庫中的散列值進行比較。使用安全的哈希算法(例如不是MD5)。更好的方法是,連接用戶名和密碼並將其散列,然後將其用作存儲在數據庫中的值並進行比較(這樣,具有相同密碼的兩個用戶不會散列爲相同的值)。

+0

+1這真的很棒的建議! – MadProgrammer

0

是的。改用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(); 
相關問題